4 回答

TA貢獻1816條經驗 獲得超4個贊
可能是你通過 GO111MODULE = on 顯式啟用了 go 模塊,然后tour的代碼下載到$GOPATH/pkg/mod/golang.org/x/[email protected]目錄下,但是tour程序通過ctx.Import查找tour src代碼dir,此時只會 from $GOROOT/src/golang.org/x/touror $GOPATH/src/golang.org/x/tour,而不會 from $GOPATH/PKG/mod,所以導致 can not找到旅游源代碼目錄。
解決方案:
解決方案1:復制$GOPATH/pkg/mod/golang.org/x/[email protected]到$GOPATH/src/golang.org/x/tour
方案二:修改游覽源local.go文件
func findRoot() (string, error) {
...
if os.Getenv("GO111MODULE") == "on" {
pkgDir := filepath.Join(os.Getenv("GOPATH"), "pkg", "mod")
cfg := &packages.Config{Mode: packages.LoadFiles, Dir: pkgDir}
pkgs, _ := packages.Load(cfg, basePkg)
for _, pkg := range pkgs {
for _, goFile := range pkg.GoFiles {
root := filepath.Dir(goFile)
if isRoot(root) {
return root, nil
}
}
}
}
return "", fmt.Errorf("could not find go-tour content; check $GOROOT and $GOPATH")
}

TA貢獻2011條經驗 獲得超2個贊
對于遇到此問題并且只想進行游覽的任何人,您可以隨時導航到$HOME\go\pkg\mod\golang.org\x\tour@version
,然后執行以下操作go run .

TA貢獻2041條經驗 獲得超4個贊
我看到了同樣的問題。按照Andy的回答,問題仍然沒有解決。我查了local.go文件中findRoot函數的代碼,它依賴于build.Default,也就是build.defaultContext()的返回值。它返回從環境變量讀取 GOPATH 的默認上下文。從源代碼build/build.go我看到:
func defaultContext() Context {
? ? var c Context
? ? c.GOARCH = envOr("GOARCH", runtime.GOARCH)
? ? c.GOOS = envOr("GOOS", runtime.GOOS)
? ? c.GOROOT = pathpkg.Clean(runtime.GOROOT())
? ? c.GOPATH = envOr("GOPATH", defaultGOPATH())
? ? // code omitted
? ? return c
}
但是,當我們使用go env -w GOPATH="/Users/elk/ccode/go"命令設置 GOPATH 時,該值僅保存在 go env 中,而不保存在您的系統環境中。因此,當您運行游覽時,由于 GOPATH 為空,因此它使用默認路徑值,通常是/Users/elk/go,這會導致找不到游覽內容。
這可能是因為《圍棋之旅》是2011年寫的,當時我們還需要設置GOPATH環境變量。但后來 Go 改進了設置,但是 go 之旅中的遺留代碼并沒有相應改變。
因此,一個快速的解決方案是在 .bashrc 文件中設置 GOPATH 變量。或者只是export GOPATH="Users/elk/ccode/go"在運行游覽程序之前在命令行中臨時使用。

TA貢獻1828條經驗 獲得超4個贊
嘗試以下步驟:
出發
GO111MODULE
_
export GO111MODULE=off
確保您不在
$GOPATH
目錄內(如果在目錄內,只需運行cd ~
)運行
go get
命令
go get golang.org/x/tour
- 4 回答
- 0 關注
- 232 瀏覽
添加回答
舉報