PATH未正确配置导致go命令找不到,需确认GOROOT指向解压路径、GO111MODULE=on和GOPROXY已设置、$HOME/go/bin在PATH中且有执行权限。

go command not found 说明 PATH 没加对,不是没装好
你在普通用户账户下解压了 go 二进制包,但执行 go version 仍报错,大概率是 PATH 没生效,而不是 Go 本身有问题。Linux/macOS 下不会自动把 $HOME/opt/go/bin 或 $HOME/go/bin 加入路径;Windows 用户改了用户环境变量也得新开命令行窗口才读取。
验证方式很简单:echo $PATH 看输出里有没有你的 go/bin 目录;ls -l ~/go/bin/go 确认文件存在且有可执行权限(-rwxr-xr-x)。
- 别在
/usr/local/go解压——没 root 权限会失败 - 别用
sudo tar强行写系统目录,后续所有操作都会卡权限 - 别只改
~/.bashrc却用zsh终端,或反过来;检查你实际用的 shell:echo $SHELL
GOROOT 必须指向你解压的目录,不能留空或指错
GOROOT 是 go 命令找标准库和编译器的唯一依据。如果它为空、指向 /usr/lib/go(APT 安装残留)、或指向一个不存在的路径,go mod 和 go build 都可能静默失败或报奇怪错误(比如 cannot find package "fmt")。
正确做法是:解压后立刻设 GOROOT,且值必须和你实际路径完全一致。例如你解压到 $HOME/local/go,那就写 export GOROOT=$HOME/local/go,不能漏掉 $HOME 或多写斜杠。
立即学习“go语言免费学习笔记(深入)”;
- 运行
go env GOROOT必须返回你设定的路径,否则配置无效 - 不要依赖系统默认推断——Go 1.20+ 虽尝试自动探测,但在非标准路径下极不可靠
- 如果
go env输出GOROOT="",说明 shell 配置根本没加载,或export写错了位置(比如缩进、拼写GOROOTT)
GO111MODULE=on + GOPROXY 是 go mod 能跑起来的前提
即使 go version 成功,go mod init 也可能卡住或报 cannot find module。这不是网络问题,而是模块模式没启用或代理没设——国内镜像源不走代理基本无法拉依赖。
这两项必须显式设置,且建议用 go env -w 写入用户级配置,避免每次开终端都手动 export:
-
go env -w GO111MODULE=on—— 强制启用模块,绕过旧版GOPATH逻辑 -
go env -w GOPROXY=https://goproxy.cn,direct—— 使用国内镜像,direct保底直连 - 验证:
go env | grep -E "(GO111MODULE|GOPROXY)"应显示对应值
注意:go env -w 会写入 $HOME/go/env,该文件由 Go 自动管理,别手动编辑。
go install 默认往 $GOPATH/bin 写,但你不一定要设 GOPATH
很多人卡在 go install 报 permission denied,是因为没意识到:只要 GOPATH 没设,Go 就会 fallback 到 $HOME/go,而 $HOME/go/bin 是你有写权限的。所以多数情况下,你根本不需要 export GOPATH。
真正要确保的是:$HOME/go/bin(或你自定义的 GOBIN)在 PATH 里,且目录存在:
- 运行
mkdir -p $HOME/go/bin创建目录(go install不会自动建) - 确认
PATH包含$HOME/go/bin(或你设的GOBIN) - 如果非要自定义安装路径,用
go env -w GOBIN=$HOME/mybin,再mkdir -p $HOME/mybin
最后提醒一句:别删 $HOME/go/pkg/mod。这是模块缓存的实际存放地,Go 会自动维护,删了下次 go mod download 又得重下一遍。


















