go

$ GOPATH no se debe establecer en $ GOROOT, ¿por qué no?



(4)

Agregue las siguientes líneas a su archivo .bashrc :

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

Luego carga el bashrc: $ source .bashrc

He instalado Go en mi máquina Linux en /usr/local/go , y pretendía usar /usr/local/go/src para el desarrollo. Sin embargo cuando intento esto me sale el siguiente error:

$GOPATH must not be set to $GOROOT

Efectivamente como lo entiendo, esto significa que no debe usar /usr/local/go para el desarrollo. Por qué no?


Debido a que /usr/local/go/src ya contiene el código de la biblioteca estándar, debe mantener su propio código separado de ese.

Lo sé, otras herramientas de desarrollo no tendrían ningún problema con eso, pero Go es un poco más estricto en algunos aspectos. Probablemente sea la misma filosofía que se encuentra detrás de marcar las variables no utilizadas o importarlas como errores: evitar problemas que pueden parecer pequeños al principio, pero que pueden llevar a dolores de cabeza más grandes en el futuro.


Desde go help gopath :

GOPATH debe configurarse para obtener, compilar e instalar paquetes fuera del árbol Go estándar.

Por lo tanto, GOROOT establece la ubicación de la biblioteca estándar , y GOPATH es para bibliotecas no estándar . Una biblioteca no debe estar en ambos lugares a la vez.


Este directorio puede estar donde está $GOROOT , pero siempre puede verificarlo a través de go env , y esto mostrará a GOROOT como una de las variables de entorno:

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

Por lo tanto, su instalación podría tenerlo en un lugar diferente, pero de cualquier manera no puede hacer la misma ruta para GOROOT y GOPATH , la razón es que su GOPATH también tiene una carpeta src , que alberga la biblioteca estándar:

@ /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

La razón por la que no puede tenerlos en el mismo lugar es porque cuando ejecuta go install , se verá tanto en GOROOT como en GOPATH , y verá que todas sus importaciones como fmt y os están presentes tanto en GOROOT como en GOPATH , y así, el pobre compilador se confundirá y comenzará a gritarte (lo que hizo en tu caso).