在閱讀了《The way to go》和《Go 語言實戰》兩本 Go 語言學習的入門書籍後,小白覺得自己的Go語言基礎知識已經足夠開始上手應用開發了。
於是小白找到了一本《Go Web 程式設計》,在閱讀這本書的過程中,自己動手開發Go Web應用,並希望在閱讀完之後,能夠開發出一個功能豐富,效能優異的Web應用。
小白很開心終於可以上手寫Go Web應用了,在編寫了一個小的伺服器Demo後,小白發現對於Go 環境變數GoPath、GoRoot還是糊里糊塗的。
直接使用Go install 去編譯程式時,如果檔案放到Go安裝路徑下的src檔案,會直接在同級目錄bin下邊生成相應的 exe 檔案。但是為什麼會這樣呢?
而且在 Go 1.22.5 版本,GoPath和GoRoot同路徑會提示警告:
warning: GOPATH set to GOROOT has no effect //這是由於GOPATH和GOROOT同路徑導致的
但把環境變數GOPATH設定為自己定義的專案路徑如:D:/goproject ,並在路徑下邊新建src、pkg、bin檔案,把專案檔案放到src路徑下,設定的GOPATH又會不生效,提示錯誤:
go: 'go install' requires a version when current directory is not in a module Try 'go install first_webapp@latest' to install the latest version
這裡小白有幾點不明白的地方
1.是不是一定要手動建src、pkg、bin檔案
2.環境變數是設定使用者變數還是系統變數,設定完後需不需要重啟
3.為什麼windows環境下,設定的GOPATH環境變數無效
4.為什麼使用Go mod,什麼是Go mod
首先第一點:
Go在執行go install 命令時,會自動掃描GOPATH環境變數指定目錄下的src檔案,所以src檔案是必須要建立的。
bin 檔案並不必須要建立,在執行go install 成功後會自動建立bin資料夾,並將生成的exe檔案放置到裡面。
pkg檔案用來存放編譯後生成的歸檔檔案例如(go module),也並不是必須建立的,可以自動生成。
第二點:
環境變數設定使用者變數或者系統變數都可以,但是如果都設定的話,使用者變數會覆蓋系統變數。
設定完成後,重啟cmd命令提示符或者vscode即可,不需要重啟電腦。
另外,在設定環境變數的時候,需要指定全路徑的方式。比如在使用 %GOROOT%/bin 設定系統變數Path不生效。
第三點:
經過驗證,跟GOPATH設定無關,如果放到Go安裝目錄的src檔案下,直接執行go install 就會自動在Go安裝目錄的bin資料夾下生成exe檔案。
而如果不在Go安裝目錄下邊,需要在專案目錄先執行go mod init初始化mod後,
再執行 go install xxx 即會再專案目錄src同級的bin檔案中生成exe檔案。其中 xxx 為module name
經回翻《Go 語言實戰》GOPATH的主要用途如下:
在import匯入包時,編譯器會使用Go環境變數設定的路徑,透過引入的相對路徑來查詢磁碟上的包。
標準庫中的包會在安裝 Go 的位置找到。
Go 開發者建立的包會在 GOPATH 環境變數指定的目錄裡查詢。GOPATH指定的目錄就是開發者的個人工作空間。
編譯器會先查詢 Go 的安裝目錄,然後才會按順序找 GOPATH 變數裡列出的目錄。
第四點:
什麼是Go mod
Go.mod是Golang1.11版本新引入的官方包管理工具用於解決之前沒有地方記錄依賴包具體版本的問題,方便依賴包的管理。
為什麼用Go mod
猜測在引入Go mod 之後,在建立專案時,生成mod檔案已經是 go 程式必須的執行步驟,以便更好的管理依賴包的問題
經過以上四個問題,小白對Go的環境變數有了更好的理解。雖然還有沒完全弄明白的地方,但在之後 Go 程式設計的路上,小白一定會越來越強。對於現在沒有弄明白的問題,也許等小白足夠強之後。
再看現在的問題,或許那些不明白的地方已經迎刃而解了。