溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

go?get和go?install的區(qū)別是什么

發(fā)布時(shí)間:2023-04-20 09:18:53 來(lái)源:億速云 閱讀:77 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了go get和go install的區(qū)別是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇go get和go install的區(qū)別是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

一、問(wèn)題背景

安裝Go庫(kù)db2struct時(shí),使用go get命令執(zhí)行

go get ``github.com/Shelnutt2/db2struct/cmd/db2struct,

執(zhí)行db2struct -h報(bào)錯(cuò):

zsh: command not found: db2struct

改為go install命令執(zhí)行

go install ``github.com/Shelnutt2/db2struct/cmd/db2struct

后成功執(zhí)行db2struct -h,同時(shí)ls $GOPATH/bin也看到了可執(zhí)行文件db2struct。

二、原因探究

(一)命令定義和區(qū)別

go installgo get 都是 Go 語(yǔ)言的工具命令,但它們之間有一些區(qū)別。

  • go get:用于從遠(yuǎn)程代碼存儲(chǔ)庫(kù)(如 GitHub)中下載或更新 Go 代碼包。它會(huì)下載代碼包并將其存儲(chǔ)在 $GOPATH/src 目錄下對(duì)應(yīng)的位置,并編譯代碼包中的程序和庫(kù)。如果目標(biāo)包之前已經(jīng)被下載過(guò)了,那么 go get 會(huì)嘗試更新到最新版本,并重新編譯程序和庫(kù)文件。在更新完代碼包后,go get 還會(huì)自動(dòng)把下載的代碼包的可執(zhí)行文件復(fù)制到 $GOPATH/bin 目錄下,以方便直接使用該可執(zhí)行文件。

  • go install:用于編譯并安裝 Go 代碼包,并將其生成的可執(zhí)行程序或庫(kù)文件存儲(chǔ)到 $GOPATH/bin 或者 $GOPATH/pkg 目錄下。如果你在項(xiàng)目目錄下執(zhí)行 go install,它將會(huì)編譯并安裝當(dāng)前項(xiàng)目的代碼,生成可執(zhí)行文件并將其保存到 $GOPATH/bin 目錄下(如果項(xiàng)目是一個(gè)庫(kù),則生成的是 .a 文件,并將其存儲(chǔ)到 $GOPATH/pkg 目錄下)。

因此,go get 用于下載和更新代碼包,并產(chǎn)生對(duì)應(yīng)的可執(zhí)行程序,而 go install 用于將一個(gè) Go 代碼包轉(zhuǎn)化為可執(zhí)行程序或庫(kù)文件,并安裝到系統(tǒng)路徑以供直接使用。

使用表格形式對(duì) go getgo install 進(jìn)行比較:

命令功能下載位置生成文件位置
go get從遠(yuǎn)程代碼庫(kù)中下載或更新 Go 代碼包$GOPATH/src$GOPATH/bin
go install編譯并安裝 Go 代碼包無(wú)需下載自身代碼,$GOPATH/src 用于依賴(lài)包的查找GOPATH/bin或GOPATH/bin 或 GOPATH/bin或GOPATH/pkg

(二)go get 是否包含了 go install

可以認(rèn)為 go get 命令包含了 go install 命令的功能,但它們之間還是存在一些細(xì)微差別。

go get 命令用于從遠(yuǎn)程代碼庫(kù)中下載或更新 Go 代碼包,并自動(dòng)編譯生成相應(yīng)的可執(zhí)行程序,同時(shí)還將其安裝到 $GOPATH/bin 目錄下,以便簡(jiǎn)化程序的運(yùn)行。go get 命令不需要指定包的路徑,它會(huì)使用 Go 語(yǔ)言規(guī)范中約定的包導(dǎo)入路徑來(lái)獲取包信息,并自動(dòng)處理包的依賴(lài)關(guān)系以方便編譯。

相比之下,go install 命令則更為靈活,它可以編譯并安裝當(dāng)前項(xiàng)目的代碼,生成可執(zhí)行文件或庫(kù),并將其保存在 $GOPATH/bin$GOPATH/pkg 目錄下。同時(shí),go install 命令還可以通過(guò)指定 -ldflags 參數(shù)來(lái)修改二進(jìn)制文件的鏈接標(biāo)志,從而將一些自定義的元信息加入到二進(jìn)制文件中,使得可以在運(yùn)行時(shí)通過(guò)代碼讀取這些信息。

在 Go 1.16 版本之后,go get 命令已經(jīng)默認(rèn)使用了 Go 模塊管理工具。而 go install 命令則始終需要先進(jìn)入到處于 Go 模塊管理的路徑下,然后才能使用該命令編譯并安裝相關(guān)代碼包。

綜上所述,可以認(rèn)為 go get 命令包含了 go install 命令的部分功能,但是在一些特殊情況下,還是需要使用 go install 命令來(lái)進(jìn)行更靈活的編譯和安裝操作。

(三)為什么要用 go install

在使用 go get 命令下載并安裝代碼包時(shí),有些情況下生成的可執(zhí)行文件可能無(wú)法生效,這通常是因?yàn)?Go 語(yǔ)言版本不兼容或編譯環(huán)境不同導(dǎo)致的。而使用 go install 命令則可以避免這些問(wèn)題,下面列舉了幾種常見(jiàn)情況:

  • 版本不兼容:如果 go get 命令下載的代碼包和當(dāng)前使用的 Go 語(yǔ)言版本不兼容,那么 go get 命令可能會(huì)產(chǎn)生編譯錯(cuò)誤或生成無(wú)法運(yùn)行的可執(zhí)行文件。對(duì)于這種情況,使用 go install 命令可以保證使用的是當(dāng)前系統(tǒng)上與 Go 語(yǔ)言版本兼容的編譯器。

  • 編譯環(huán)境不同:在使用 go get 命令下載代碼包時(shí),有時(shí)它們的編譯環(huán)境與當(dāng)前環(huán)境不同,可能會(huì)導(dǎo)致可執(zhí)行文件無(wú)法正常工作。而在使用 go install 命令時(shí),該命令會(huì)在當(dāng)前環(huán)境下重新編譯源代碼并生成可執(zhí)行文件,從而能夠更加穩(wěn)定地運(yùn)行代碼。

  • 依賴(lài)關(guān)系復(fù)雜:在使用 go get 命令下載大型的代碼包時(shí),它可能會(huì)自動(dòng)下載和安裝大量依賴(lài)項(xiàng)。這樣可能會(huì)導(dǎo)致依賴(lài)關(guān)系變得復(fù)雜而難以管理,有時(shí)可能會(huì)在下載或編譯依賴(lài)項(xiàng)時(shí)產(chǎn)生錯(cuò)誤或警告。而 go install 命令會(huì)直接從當(dāng)前路徑下對(duì)應(yīng)依賴(lài)項(xiàng)中尋找依賴(lài)項(xiàng),因此可以避免這種情況下帶來(lái)的復(fù)雜性和錯(cuò)誤。

綜上所述,盡管 go get 命令十分方便快捷,但在遇到一些特殊情況時(shí),仍然需要使用 go install 命令以獲得更加穩(wěn)定的編譯和安裝效果。

可以使用如下表格來(lái)對(duì)比 go getgo install 的編譯區(qū)別:

命令功能編譯效果應(yīng)用場(chǎng)景
go get下載或更新 Go 代碼包并生成可執(zhí)行文件可能由于版本或編譯環(huán)境的不同,生成的可執(zhí)行文件無(wú)法運(yùn)行或出現(xiàn)其他問(wèn)題需要快速下載和安裝指定版本的 Go 代碼包,如果生成的可執(zhí)行文件無(wú)法運(yùn)行,則需要使用 go install 命令重新編譯
go install編譯并安裝 Go 代碼并生成可執(zhí)行文件或庫(kù)在當(dāng)前環(huán)境下重新編譯源代碼并生成可執(zhí)行文件或庫(kù),能夠更加穩(wěn)定地運(yùn)行代碼包需要在當(dāng)前環(huán)境下重新編譯 Go 代碼并生成二進(jìn)制文件,需要避免由于版本不兼容、編譯環(huán)境不同或依賴(lài)關(guān)系復(fù)雜性導(dǎo)致的編譯錯(cuò)誤和生成的可執(zhí)行文件無(wú)法運(yùn)行的問(wèn)題。

關(guān)于“go get和go install的區(qū)別是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“go get和go install的區(qū)別是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI