$ GOPATH不能设置为$ GOROOT,为什么不呢?

时间:2014-04-05 07:08:52

标签: go

我已在/usr/local/go的Linux机器上安装了Go,并打算使用/usr/local/go/src进行开发。但是,当我尝试这个时,我收到以下错误:

$GOPATH must not be set to $GOROOT

据我了解,这意味着您不应该使用/usr/local/go进行开发。为什么不呢?

5 个答案:

答案 0 :(得分:22)

因为/usr/local/go/src已经包含标准库的代码,所以您应该将自己的代码与之分开。

我知道,其他开发工具对此没有任何问题,但Go在某些方面更严格一些。这可能与将未使用的变量或导入标记为错误背后的原理相同 - 避免一开始可能看起来很小的问题,但可能导致未来更大的麻烦。

答案 1 :(得分:6)

来自go help gopath

  

必须将GOPATH设置为获取,构建和安装包之外的包   标准的Go树。

因此,GOROOT设置标准库的位置,GOPATH用于非标准库。一个图书馆不应该同时在两个地方。

答案 2 :(得分:5)

此目录可能是$GOROOT所在的位置,但您始终可以通过go env进行检查,这会将GOROOT列为环境变量之一:

$ go env 
GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.2.1/libexec" # <- its right here
GOTOOLDIR="/usr/local/Cellar/go/1.2.1/libexec/pkg/tool/darwin_amd64"
TERM="dumb"
CC="clang"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common"
CXX="clang++"
CGO_ENABLED="1"

因此,您的安装可能会将其置于不同的位置,但无论哪种方式,您都无法为GOROOTGOPATH创建相同的路径,原因是您的GOPATH也是有一个src文件夹,里面有标准库:

@ /usr/local/Cellar/go/1.2.1/libexec/src/pkg
± % ls                                                                    
archive   container errors    hash      log       path      strconv   text
bufio     crypto    expvar    html      math      reflect   strings   time
builtin   database  flag      image     mime      regexp    sync      unicode
bytes     debug     fmt       index     net       runtime   syscall   unsafe

您不能将它们放在同一个地方的原因是因为当您运行go install时,它会同时显示GOROOTGOPATH,并且会看到您的全部内容fmtos中都包含GOROOTGOPATH这样的导入,因此糟糕的编译器会混淆并开始向你大喊大叫(在你的情况下它会这样做) )。

答案 3 :(得分:5)

在您的{ ‘field1’: value1 }, { ‘field2’: value2 }, { ‘field3’: [ { ‘field3_1’: value3 }, { ‘field3_2’: value4 } ] } ]’}’ 文件中添加以下行:

.bashrc

然后加载bashrc:export GOPATH=/home/user/workspace export GOROOT=/home/user/go export PATH=$GOPATH/bin:$PATH

答案 4 :(得分:0)

你必须初始化它,它会工作得很好,不需要重新设置 GOPATH,只需运行:

go mod init your-project-name

然后您就可以使用 go get 或运行您的 go 代码而完全没有问题