GOROOT、GOPATH、PATH三个变量必须显式配置,缺一不可;PATH须包含$GOROOT/bin和$GOPATH/bin,GOROOT指向Go安装根目录(如/usr/local/go),GOPATH为工作区根目录(如$HOME/go),二者不可混淆,且均需在shell配置中导出并重载生效。

直接结论:GOROOT、GOPATH、PATH 三个变量必须显式配置,缺一不可;PATH 中必须包含 $GOROOT/bin 和 $GOPATH/bin,否则 go 命令和 go install 生成的二进制都找不到。
GOROOT 指向哪里才对
GOROOT 是 Go SDK 的安装根目录,不是你放项目的路径。官方二进制包解压后默认在 /usr/local/go,所以通常设为:
export GOROOT=/usr/local/go
如果你用 goenv 管理多版本,GOROOT 会自动切换,但手动安装时千万别写成 $HOME/go 或 /usr/lib/go(后者常见于 apt 安装,版本老旧且权限受限)。
- 检查是否生效:
go env GOROOT输出应与你设置的一致 - 如果输出为空或错误路径,说明 shell 配置没加载,或被其他配置覆盖(比如
/etc/profile里有冲突定义) - GOROOT 不该指向
src或bin子目录,只到顶层目录即可
GOPATH 为什么不能省略
GOPATH 是你的工作区,决定 go get 下载的包存哪、go install 编译出的二进制放哪。Go 1.16+ 虽默认启用 modules,但 GOPATH 仍控制 bin/ 目录——也就是你执行 mytool 命令时系统找得到它的唯一地方。
立即学习“go语言免费学习笔记(深入)”;
典型配置:
export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
- 不要把 GOPATH 设成
/usr/local/go或/opt/go:这些是 GOROOT 范畴,写入会触发权限错误 - 不要设成
$HOME/go/src:GOPATH 应是工作区根目录,Go 会自动在下面建src、pkg、bin - 如果
go env GOPATH输出空,go install可能静默失败或往GOROOT下写,导致permission denied
PATH 配错就等于没装
PATH 决定终端能不能敲出 go、gofmt、以及你自己 go install 出来的命令。只加 $GOROOT/bin 不够,漏掉 $GOPATH/bin 就运行不了自己写的工具。
正确写法(放在 ~/.bashrc 或 ~/.zshrc 末尾):
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- 顺序不重要,但两个
bin目录都得在 PATH 里 - 别用
sudo运行go install来绕过路径问题——这是掩盖配置缺陷 - 改完记得
source ~/.zshrc(或对应 shell 文件),否则新开终端才生效 - 验证:
which go应输出/usr/local/go/bin/go;which mytool应输出$HOME/go/bin/mytool
crontab 或 systemd 里跑 Go 程序时环境变量丢失
crontab 默认只有极简 PATH(/usr/bin:/bin),不读你的 ~/.bashrc,所以 go 命令根本找不到,更别说依赖 GOPATH。
两种可靠做法:
- 在
crontab -e文件顶部直接写死变量:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/binGOPATH=/home/youruser/go - 或者封装成 shell 脚本,在脚本开头
source ~/.zshrc或显式export所有变量(推荐前者,更贴近交互式环境) - 绝对避免在 crontab 里写
*/5 * * * * cd /my/project && go run main.go——go命令不存在,也不会报错,只会静默失败
最常被忽略的点:go env 在交互式 shell 里是对的,但在 cron 里完全不一样;不显式声明,就等于没配。


















