最近在配置 VSCode 的 Go 插件時,總是報錯找不到包之類的,發現時 GOPATH 和 GOROOT 在該編輯器中沒有配置,借此了解一下兩個環境變數,目前筆者用系統是 macOS BigSur,Go 版本 1.16.6
GOROOT
$GOROOT,便是 Go 的安裝路徑,存放 Go 的內置程式庫,通常你安裝完后,你電腦的環境變數就會設好 GOROOT 路徑,當你開發 Go 程式的時候,當你 import 內置程式庫的時候,并不需要額外安裝,而當程式運行后, 默認也會先去 GOROOT 路徑下尋找相對應的庫來運行,
通過 go env 可以查看有關 Go 語言的相關環境變數設定,通常如果你是初次安裝 Go,并且沒做什么環境變數設定的話,GOROOT 設定路徑就是你當初安裝 Go 語言的路徑,通常類似于 /usr/local/go、/usr/local/Cellar/go/1.xx.x/libexec,一般為前者做軟連接到后者,而 GOPATH 通常默認會是用戶目錄下的 go 檔案夾,通常類似于 $HOME/go,
# vio1etus @ 192 in /usr/local/Cellar/go/1.16.6/libexec
$ tree ./ -L 1
./
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── PATENTS
├── SECURITY.md
├── VERSION
├── api
├── bin
├── doc
├── favicon.ico
├── lib
├── misc
├── pkg
├── robots.txt
├── src
└── test
8 directories, 7 files
上述檔案,有三點可了解:
bin 目錄:執行檔案:go、gofmt,甚至 godoc
doc 目錄:Go 各個版本的檔案
src 目錄:go 標準庫原始碼
GOPATH
Go 采用包管理,沒有專案的概念,Go作業區是Go管理我們的源檔案、編譯的二進制檔案和快取物件的地方,快取物件用于以后更快的編譯,雖然也可以有多個作業區,但通常建議只有一個,GOPATH 便充當作業區的根檔案夾,
GOPATH,也叫作業區目錄(workspace directory),是Go代碼所在的目錄, Go 尋找 Go 作業區的位置,如果未設定環境變數,默認情況下,Go 假定我們的 GOPATH 位置在 $HOME/go,其中 $HOME 是我們計算機上用戶帳戶的根目錄, 我們可以通過設定 $GOPATH 環境變數來改變它, 如需進一步學習,請按照本教程閱讀和設定 Linux 中的環境變數, 要檢查這一點,請輸入以下命令:go env GOPATH
$ go env GOPATH
/Users/vio1etus/go
一個 GOPATH 作業區,一般這樣:
./
├── bin
├── pkg
└── src
├── hello_github
└── hello_router.go
- bin:保存編譯后生成的可執行檔案,我們的作業系統使用
$PATH環境變數來查找無需完整路徑即可執行的二進制應用程式,建議將此目錄:$GOPATH/bin添加到我們的全域$PATH變數中, - pkg:它保存已安裝的包物件(比如:.a),每個目標作業系統和體系結構對都有自己的 pkg 子目錄, Go 編譯包時生成的中間檔案,用來快取提高編譯效率,
- src:包含源代碼(比如:.go .c .h .s等), 該路徑決定 import 包時的匯入路徑或可執行檔案名稱,
import包的搜索順序:- GOROOT/src:該目錄保存了Go標準庫代碼,
- GOPATH/src:該目錄保存了應用自身的代碼和第三方依賴的代碼,
GOROOT 和 GOPATH 配置
-
查看二者的環境變數
go env查看 Go 相關全部環境變數
go env 變數名,如:go env GOROOT、go env GOPATH等 -
配置 GOROOT
一般情況下 GOROOT 無需配置,但是如果你看到 GOROOT 為空,那可以:which go查看 go 的位置$ go env GOROOT /usr/local/Cellar/go/1.16.6/libexec (base) # vio1etus @ 192 in ~/go/src [15:40:34] $ which go /usr/local/bin/go (base) # vio1etus @ 192 in ~/go/src [15:41:41] $ ll /usr/local/bin/go lrwxr-xr-x 1 vio1etus admin 26B Aug 8 21:08 /usr/local/bin/go -> ../Cellar/go/1.16.6/bin/go- 設定環境變數
export GOROOT=/usr/local/bin/go
-
配置 GOPATH
- 在電腦上任意位置創建作業區目錄,例如:
~/GO_PROJECTS - 設定環境變數
export GOPATH=~/GO_PROJECTS
- 在電腦上任意位置創建作業區目錄,例如:
go run、go build 和 go get
go run
go run,簡單理解就像是解釋的方式來執行代碼,而在細節上它其實會將代碼進行編譯,最后產生可執行檔案,然后運行該可執行檔案,產生程式執行后的結果,而可執行檔案會放在特定的臨時檔案里面,執行完就會自動洗掉了, 通常開發上就是用于假設只是要測驗一段代碼,那就會用go run來執行,
go build
go build 僅僅編譯以匯入路徑命名的包及其依賴項,將其放到本地,通常在 $GOPATH 目錄下執行 go build,Go 會自動去src下尋找對應專案目錄,默認是在當前目錄下生成可執行檔案,
go build 缺點:每次編譯代碼,比較沒有效率,當專案架構越來越大,build的速度也就越來越慢,
go install
因為 go build的缺點,因此有 go install 指令,go install 可以做兩件事情:
- 將包編譯成.a 中間快取物件,如果原始碼尚未更改,將在下一次編譯期間使用快取,
- 如果是main包,并將其編譯成可執行檔案
.
├── bin
│ └── hello # by go install
└── src
└── hello
├── hello # by go build
└── hello.go
注意:
- go install 如果要在非GOPATH路徑下使用的話,要先設定GOBIN環境變數,否則會出現錯誤
- 通常GOBIN環境變數就是設定GOPATH/bin,
go get(deprecated in go1.16)
GOPATH 很大的缺點,就是相關第三方包只要不是官方庫,都需要放置在GOPATH/src的路徑下才可使用,通常我們會使用go get指令來獲取網路上的第三方包,并安裝到本地,例如:
go get github.com/gin-gonic/gin
當我們從Github 上下載第三方包多了之后,會發現 GOPATH/src 下的代碼會很復雜,除了有你自己開發的專案檔案夾,也包含其他第三方庫的專案檔案夾,
此外,如果你開發的專案采用第三方套件是不同版本也很棘手,以往的解決方法是要設定多組不同的GOPATH, 雖然社群也有開發相對應的 package manager,如 Vendor、Dep 來解決該問題,但畢竟不是官方主導的,因此,有了 Go Modules 的誕生,我們下一篇文章再講,
但是從 Go 1.16 開始逐漸廢棄 go get 安裝包的功能,詳細見New module changes in Go 1.16 - go.dev,官方推薦使用 go install 帶版本安裝, 使用示例:
go install golang.org/x/tools/gopls@latest
go install golang.org/x/tools/[email protected]
參考資料
- go cmd/go pkg.go.dev
- go - What should be the values of GOPATH and GOROOT? - Stack Overflow
- Golang — GOROOT、GOPATH、Go-Modules-三者的關係介紹 | by 陳冠億 Kenny | 企鵝也懂程式設計 | Medium
- go - What should be the values of GOPATH and GOROOT? - Stack Overflow
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/296219.html
標籤:區塊鏈
上一篇:web3.js 互動 geth 實作轉賬余額查詢功能
下一篇:Go modules
