go command not found 的根本原因是PATH未正确配置,需确认Go安装路径(如/usr/local/go/bin或C:\Go\bin)是否已加入对应shell的配置文件并source生效。

go command not found 怎么办
这是最常遇到的问题,本质是 shell 找不到 go 可执行文件。不是 Go 没装好,而是 PATH 没配对。
- 先确认 Go 是否真装在了预期位置:Linux/macOS 运行
ls /usr/local/go/bin/go;Windows 查看C:\Go\bin\go.exe是否存在 - 检查当前 shell 配置文件是否生效:用
echo $PATH看输出里有没有/usr/local/go/bin(macOS/Linux)或C:\Go\bin(Windows) - 别只改 ~/.zshrc 就完事——如果你用的是 fish 或 bash,得改对应配置文件;macOS Catalina 及之后默认用 zsh,但部分终端仍加载 ~/.bash_profile
- 改完记得
source ~/.zshrc(或对应文件),且新开一个终端窗口验证,旧窗口不会自动 reload
go install 权限被拒:mkdir /usr/lib/go/pkg/… permission denied
错误提示里出现 /usr/lib/go 或 /usr/local/go 路径,说明 go install 试图往 GOROOT 写东西,这是错的。GOROOT 是只读安装目录,不该放用户代码或二进制。
- 运行
go env GOROOT GOPATH GOBIN,重点看GOPATH是否为空或指向系统路径(如/usr/lib/go) - 正确做法是显式设置
GOPATH=$HOME/go,并确保GOBIN明确设为$GOPATH/bin(避免 fallback 到 GOROOT 下的 bin) - 不要把
$GOROOT/bin和$GOPATH/bin都塞进 PATH——$GOROOT/bin放前面就行,$GOPATH/bin仅用于存放你go install编译出的工具 - 如果用 Homebrew 安装 Go,
which go应该返回/opt/homebrew/bin/go(Apple Silicon)或/usr/local/bin/go(Intel),而不是/usr/local/go/bin/go;冲突时优先清理手动安装残留
go mod init 后 go get 失败:proxy.golang.org timeout 或 forbidden
国内直连官方代理基本不可用,但硬切国内镜像又容易配错格式或漏掉 go env -w 持久化。
- 临时生效用:
export GOPROXY=https://mirrors.aliyun.com/goproxy/,https://proxy.golang.org,direct - 永久生效必须加
-w:go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,https://proxy.golang.org,direct - 注意逗号分隔、末尾
,direct不能少——它表示当镜像源找不到包时回退到直接拉取,否则私有模块会失败 - 某些企业网络会拦截
goproxy.io域名,阿里云镜像(mirrors.aliyun.com/goproxy)更稳定;若仍失败,可试https://goproxy.cn -
go env -w GOSUMDB=off可跳过校验(仅开发环境),避免因 checksum 服务器不可达导致go get卡住
go run hello.go 成功但 go build 出来文件无法执行
不是编译失败,而是生成的二进制文件权限不对,或目标平台不匹配。
立即学习“go语言免费学习笔记(深入)”;
- Linux/macOS 上检查文件权限:
ls -l hello,如果没x(执行位),手动加:chmod +x hello - 跨平台交叉编译时忘了设
GOOS/GOARCH:比如在 macOS 上想构建 Linux 二进制,得先GOOS=linux GOARCH=amd64 go build,否则默认生成 darwin 版本 - 某些 IDE(如 VS Code)的终端可能继承了错误的 shell 环境变量,导致
go build实际运行在不同 GOPATH 下;建议统一在系统终端里验证 - 如果 build 出来的是空文件或大小为 0,大概率是
main.go里没写func main(),或 package 名不是main
source,或用了 export 但没加 -w,导致重启终端就失效。每个 go env 输出的值,都得对应到真实 shell 环境里去验证,不能只信文档写的“应该”。


















