go install报permission denied的真实原因是gopath或gobin未生效,导致工具链fallback至只读的goroot目录(如/usr/local/go);需显式设置gopath、gobin并加入path,确保$home/go/bin存在且可写。

go install 报 permission denied 的真实原因
不是你没权限,而是 Go 工具链“找不到家”,被迫往 /usr/local/go 或 /usr/lib/go 这类只读系统目录里写东西。它想建 pkg 或放二进制到 bin,但这些路径属主是 root,普通用户根本碰不了。
典型错误信息长这样:mkdir /usr/lib/go/pkg/linux_amd64/github.com: permission denied —— 看见 /usr/lib/go 就能断定:GOPATH 或 GOBIN 没生效,或者压根没设。
-
go env GOPATH输出为空或仍是默认值(比如/root/go),说明变量没导出或 shell 配置没加载 -
go env GOBIN为空,且$GOPATH/bin目录不存在,工具链会 fallback 到$GOROOT/bin - 在 Docker 或新装系统里,
GOPATH很可能根本没被 shell 读取,别信“默认就行”
必须显式设置 GOPATH 和 GOBIN
别依赖任何“自动推导”。每台机器、每个用户都得自己建目录、自己导出变量、自己加进 PATH。
执行以下三步(以 Bash/Zsh 为例):
mkdir -p $HOME/go/{src,pkg,bin}export GOPATH=$HOME/goexport GOBIN=$HOME/go/bin-
export PATH=$GOBIN:$PATH(顺序不能错,确保你的bin在系统路径前)
写进 ~/.zshrc 或 ~/.bashrc,再运行 source ~/.zshrc。验证:两个 go env 命令输出的路径必须是你刚设的,且 $HOME/go/bin 确实存在、可写。
多用户共用 NFS 时 GOCACHE 权限冲突
多人共用服务器,尤其 home 目录挂载自 NFS,go mod download 会报 cannot lock cache directory 或 permission denied —— 这不是权限错,是 NFS 下 flock 失效,多个进程争抢 $GOCACHE 锁文件。
默认 $GOCACHE 是 $HOME/.cache/go-build,NFS 共享后锁机制崩了。
- 不要用
go env -w GOCACHE=...,它写进$HOME/go/env,会被su切换用户继承,污染严重 - 改用 shell 初始化文件显式声明:
export GOCACHE=/tmp/$USER/go-cache - 配套创建目录:
mkdir -p /tmp/$USER/go-cache && chmod 700 /tmp/$USER/go-cache - 优先指向本地磁盘(如
/tmp),避开 NFS
GOPROXY 配错导致下载卡住,误判为权限问题
网络不通或代理配置错,go mod download 可能超时后 fallback 到系统路径写缓存,最后报的还是 permission denied —— 实际是网络失败引发的连锁反应。
国内必须配对 GOPROXY 和 GOPRIVATE:
- 设代理:
go env -w GOPROXY="https://mirrors.tuna.tsinghua.edu.cn/go/modules/,https://goproxy.cn,direct" - 私有库必须排除:
go env -w GOPRIVATE="git.example.com,github.com/my-org/*"(逗号分隔,无空格) - 临时诊断:
GOPROXY=direct go mod download -v,看是立刻失败(网络问题)还是仍卡住(Git 凭证或 SSH 问题) -
go env GO111MODULE必须输出on;若为auto且当前路径在$GOPATH/src下,Go 会退回到老模式,拒绝模块下载
最易被忽略的点:GOBIN 和 GOCACHE 都要指向**本地可写路径**,且属主明确;GOPROXY 和 GOPRIVATE 必须同时生效,缺一不可——代理没设好,工具链连模块都拉不下来,自然没机会走到写入阶段。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











