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

Kev*_*rke 31 go

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

$GOPATH must not be set to $GOROOT
Run Code Online (Sandbox Code Playgroud)

实际上,据我了解,这意味着您不应该/usr/local/go用于开发.为什么不?

rob*_*b74 24

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

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


MKa*_*ama 7

来自go help gopath:

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

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


Gam*_*iac 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"
Run Code Online (Sandbox Code Playgroud)

所以,你的安装可能有它在不同的地方,但无论哪种方式,你不能犯同样的路径都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
Run Code Online (Sandbox Code Playgroud)

为什么你不能让他们在同一个地方的原因是因为当你运行go install它的外观均GOROOTGOPATH,它会看到所有你喜欢的进口fmt,并os同时存在于GOROOTGOPATH,因此旅途中的编译器将分差困惑并开始向你大喊大叫(在你的情况下它做了).


Yri*_*ues 5

.bashrc文件中添加以下行:

export GOPATH=/home/user/workspace
export GOROOT=/home/user/go
export PATH=$GOPATH/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

然后加载bashrc: $ source .bashrc

  • 什么是工作空间? (2认同)