goland go test 多个文件_这个代码怎么会编译不通过?Goland 新手常见问题解决:GOPATH 和 Go Modules 编译不成功...
點擊上方藍色“Go語言中文網”關注我們,設個星標,每天學習Go語言
自從 Go1.11 開始,官方開始支持依賴管理,這就是 Go Modules。如果你對 Go Modules 還不熟悉,請一定要掌握,Go 1.13 默認會使用它。推薦閱讀 Go 官方博文,GCTT 譯文:Go Modules 的使用方法。
新手學習的時候,對于 GOPATH 和 Go Modules 可能容易搞混,特別是,很多資料,依然是 GOPATH 的,而最新版本的一些 IDE 或編輯器可能默認使用 Modules,這樣很容易出現一些“自己解決不了的問題”。(特別是即將發布的 Go1.13 會默認啟用 Modules)
我們來看一個具體的例子,使用 Goland。(Go 版本:1.12.6)
創建項目 testgopath
如圖,我們使用 GOPATH 模式。
image-20190706231208346.png之后,創建如下目錄和文件:
image-20190706233136771.png其中,hello.go 文件代碼如下:
package mainimport "fmt"
func demo() {
fmt.Println("This is demo")
}
helloworld.go 文件代碼如下:
package mainimport "fmt"
func main() {
fmt.Println("Hello")
demo()
}
(以上目錄和代碼來自球友咨詢的問題)。
如何運行 GOPATH 項目
1)在 helloworld.go 文件右鍵彈出菜單,執行:Run "go build helloworld.go”,結果如下:
# command-line-argumentssrc/hello/hellowrold.go:7:2: undefined: demo
Compilation finished with exit code 2
很明顯,無論是 go run 還是 go build ,多個文件的項目,只提供單個文件是不行的。
2)配置運行:go build hello ,采用 Package 的運行方式,很可能結果是:
image-20190707170457999.pngcan't load package: package hello: unknown import path "hello": cannot find module providing package hello
3)go build hello,選擇 Directory 的方式,沒有出現錯誤。
image-20190707170620536.png然而,執行 Run,我這里卻報錯了:
go: cannot find main module; see 'go help modules'
從錯誤提示可知,啟用的是 Go Modules 而不是 GOPATH。原因是我在全局配置了 GO111MODULE=on。實際上,Go1.13 開始,默認也會啟用 Modules,所以這個錯誤會很常見。
知道原因,我們就可以通過配置環境變量,禁用 Modules 來解決:
image-20190707171035598.png這次運行正常了!
4)如果你在 IDE 下怎么配置運行都不對時,你試試在終端執行。
GOPATH 模式下,對于 go build 來說,只要 GOPATH 正確,go build hello 總是能成功;
上面的規則,在終端驗證成功了,那么我們可以肯定,IDE 不成功的原因是 GOPATH 不對。(一樣要注意 GO111MODULE 這個環境變量的值)
對于 Goland IDE 來說,我們打開 Preferences,在 Go > GOPATH 下,配置 Project GOPATH:
image-20190707171218645.png這時,我們再回到 Package 的運行模式重試,會發現也正常了。(如果不成功,一樣需要加上 GO111MODULE=off)。
將項目改造為 module
將 GOPATH 項目改造為 module ,推薦閱讀:遷移到 mod 只需 3 個步驟[1]。
針對上面的 testgopath,我們執行如下遷移動作:
cd /Users/xuxinhua/project/golang/testgopath
mv src/* . && rm -rf src
go mod init testgopath
這樣,我們已經成功將項目改造為 module 模式了。
打開 Goland,很可能會發現多了一個 pkg 目錄:
image-20190707172542398.png原因是,module 模式會將依賴和緩存寫入一個 GOPATH 目錄中,一般情況下是全局的 GOPATH(通常是 $HOME/go),因為我們上面為該項目制定了 Project GOPATH,所以出現了 pkg 目錄。我們可以改為 Global GOPATH,同時刪除 pkg 目錄。
如何運行 module 項目
和運行 GOPATH 項目一樣,我們使用三種方式運行,go build helloworld.go 的 File 方式肯定不行,我們著重看 Package 和 Directory 方式。
1)Directory 方式,如下配置:
一切正常!
2)Package 方式,如下配置:
image-20190707174205533.png這里說明兩點:
Package path:testgopath/hello,也就是需要加上 module 的名字
報錯了,提示找不到包
雖然報錯,我們強制執行,點擊工具欄 Run,會出現彈窗:
image-20190707174405827.png不管它,依然 Run(Continue Anyway)。會發現運行正常!這說明 Goland 誤報了?
還記得我們通過 Goland 創建該項目時, 并沒有選擇 Go Modules(vgo) 模式。而且,如果你項目依賴了其他包,會提示各種找不到依賴包的錯誤。這時候,我們只需要將項目配置改為 Go Modules(vgo) 即可。
https://goproxy.cn 可能是一個更好的選擇勾選 Enable Go Modules
國內環境下,一般需要配置 Proxy,具體可以參考我之前的文章:Go module 模式下解決“墻”問題[2]
這樣配置后,發現紅叉沒了,運行一切正常。
總結
無論我們使用什么編輯器(IDE),遇到問題時,我們如果知曉原理,都能夠輕松解決掉;如果不知曉原理,通過瞎配置或其他方式碰巧對了,下次遇到其他問題,你依然一臉懵逼。
因此,知其然并知其所然很重要!GOPATH 和 Go Modules 的環境問題搞明白了嗎?建議按照文章的步驟自己實際試試,加深理解,有問題留言溝通。
補充:隨著 Modules 成為趨勢,慢慢請忘掉 GOPATH 吧!
基于 Go1.13 的話,建議執行:go env -w GOPROXY=https://goproxy.cn,direct
參考資料
[1]遷移到 mod 只需 3 個步驟: https://studygolang.com/articles/17780
[2]Go module 模式下解決“墻”問題: https://studygolang.com/topics/8737
覺得不錯關注我們,點個贊、轉發吧
總結
以上是生活随笔為你收集整理的goland go test 多个文件_这个代码怎么会编译不通过?Goland 新手常见问题解决:GOPATH 和 Go Modules 编译不成功...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连子心的功效和作用
- 下一篇: 牙周炎去哪个科室检查