为了账号安全,请及时绑定邮箱和手机立即绑定

本地运行 Go Tour 时出错:找不到游览文件:找不到 go-tour 内容;

本地运行 Go Tour 时出错:找不到游览文件:找不到 go-tour 内容;

Go
慕桂英3389331 2023-07-17 14:56:04
go version go1.12.9 darwin/amd64安装该golang.org/x/tour软件包后,我运行命令tour并收到错误:Couldn't find tour files: could not find go-tour content; check $GOROOT and $GOPATH这是输出go env:GOARCH="amd64"GOBIN=""GOCACHE="/Users/elk/Library/Caches/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="darwin"GOOS="darwin"GOPATH="/Users/elk/ccode/go"GOPROXY="https://goproxy.io"GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"GCCGO="gccgo"CC="clang"CXX="clang++"CGO_ENABLED="1"GOMOD="/dev/null"CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/5d/q9dj2fxx4t71w0g5g00cvlkh0000gn/T/go-build144784202=/tmp/go-build -gno-record-gcc-switches -fno-common"我在里面添加两行.zshrc:export GOPATH="$HOME/ccode/go"export PATH="$PATH:$GOPATH/bin"该命令go get golang.org/x/tour运行时没有错误。奇怪的是: echo $GOROOT会显示一个空行并且echo $GOPATH与 一致go env。
查看完整描述

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")

}


查看完整回答
反对 回复 2023-07-17
?
森林海

TA贡献2011条经验 获得超2个赞

对于遇到此问题并且只想进行游览的任何人,您可以随时导航到$HOME\go\pkg\mod\golang.org\x\tour@version,然后执行以下操作go run .



查看完整回答
反对 回复 2023-07-17
?
缥缈止盈

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"在运行游览程序之前在命令行中临时使用。


查看完整回答
反对 回复 2023-07-17
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

尝试以下步骤:

  1. 出发GO111MODULE_

   export GO111MODULE=off
  1. 确保您不在$GOPATH目录内(如果在目录内,只需运行cd ~

  2. 运行go get命令

   go get golang.org/x/tour


查看完整回答
反对 回复 2023-07-17
  • 4 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信