我已在/usr/local/go
的Linux机器上安装了Go,并打算使用/usr/local/go/src
进行开发。但是,当我尝试这个时,我收到以下错误:
$GOPATH must not be set to $GOROOT
据我了解,这意味着您不应该使用/usr/local/go
进行开发。为什么不呢?
答案 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"
因此,您的安装可能会将其置于不同的位置,但无论哪种方式,您都无法为GOROOT
和GOPATH
创建相同的路径,原因是您的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
时,它会同时显示GOROOT
和GOPATH
,并且会看到您的全部内容fmt
和os
中都包含GOROOT
和GOPATH
这样的导入,因此糟糕的编译器会混淆并开始向你大喊大叫(在你的情况下它会这样做) )。
答案 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 代码而完全没有问题