4 回答
TA贡献1816条经验 获得超4个赞
可能是你通过 GO111MODULE = on 显式启用了 go 模块,然后tour的代码下载到$GOPATH/pkg/mod/golang.org/x/tour@v0.0.0-20191002171047-6bb846ce41cd目录下,但是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/tour@v0.0.0-20191002171047-6bb846ce41cd到$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 关注
- 154 浏览
添加回答
举报