Подтвердить что ты не робот

$ GOPATH не должен быть установлен в $GOROOT, почему бы и нет?

Я установил Перейти на мою машину Linux в /usr/local/go и намеревался использовать /usr/local/go/src для разработки. Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:

$GOPATH must not be set to $GOROOT

Эффективно, как я понимаю, это означает, что вы не должны использовать /usr/local/go для разработки. Почему бы и нет?

4b9b3361

Ответ 1

Потому что /usr/local/go/src уже содержит код для стандартной библиотеки, и вы должны оставить свой собственный код отдельно от него.

Я знаю, что другие инструменты разработки не будут иметь проблем с этим, но Go немного более строг в некотором роде. Это, вероятно, та же самая философия, которая лежит за пометкой неиспользуемых переменных или импорта как ошибок - избегая проблем, которые могут сначала казаться маленькими, но могут привести к большему числу головных болей в будущем.

Ответ 2

От go help gopath:

GOPATH должен быть установлен для получения, сборки и установки пакетов за пределами стандартное дерево Go.

Таким образом, GOROOT устанавливает расположение стандартной библиотеки, а GOPATH - для нестандартных библиотек. Одна библиотека не должна находиться в обоих местах сразу.

Ответ 3

Этот каталог может быть где вы $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, и, следовательно, компилятор плохого выхода будет запутан и начнет кричать на вас (что было в вашем случае).

Ответ 4

Добавьте следующие строки в ваш файл .bashrc:

export GOPATH=/home/user/workspace
export GOROOT=/home/user/go
export PATH=$GOPATH/bin:$PATH

Затем загрузите bashrc: $ source.bashrc

Ответ 5

Добавьте ниже три строки в вашем файле ~/.bashrc.

export GOROOT="$HOME/go" # extracted tar.gz go 
export GOPATH="$HOME/go/bin"
export PATH="$GOPATH:$PATH"

Другими словами, $GOROOT/bin является $GOPATH