go install 写入 /usr/lib/go/pkg 报 permission denied,是因为 gopath 未正确设置或为空,导致 go 工具链退回到只读的 goroot 目录;应创建标准工作区(mkdir -p $home/go/{src,pkg,bin}),设置 export gopath=$home/go 和 export path=$gopath/bin:$path,并确保 $gopath/bin 可写且在 path 中。

go install 写入 /usr/lib/go/pkg 报 permission denied 怎么办
这不是你没权限,是 Go 工具链误用了 GOROOT 而非 GOPATH。只要 GOPATH 为空或未被识别,go install 就会退回到往 $GOROOT/pkg 写包——而那里是只读的系统目录。
- 先运行
go env GOPATH,如果输出空或不是你期望的路径(比如/home/you/go),说明没设对 - 执行
mkdir -p $HOME/go/{src,pkg,bin}创建标准工作区 - 在 shell 配置里加两行:
export GOPATH=$HOME/go和export PATH=$GOPATH/bin:$PATH - 重载配置后验证:
go env GOPATH和echo $PATH | grep go都应命中用户目录
GOBIN 不设就一定出问题吗
不一定,但容易踩坑。默认行为是把 go install 编译的二进制丢进 $GOPATH/bin,前提是 GOPATH 有效;但如果 GOPATH 多个路径(用 : 分隔),它只用第一个的 bin 子目录,且不会自动创建该目录——mkdir -p $GOPATH/bin 必须手动做。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
-
GOBIN显式设为$HOME/go/bin更可靠,尤其当GOPATH是多个路径时 - 设了
GOBIN后,go install完全忽略GOPATH的bin,只写GOBIN指向的位置 - 注意:即使设了
GOBIN,也得确保它在PATH里,否则装完命令找不到
os.Mkdir 权限总是比预期低,比如传 0777 却得到 0755
这不是 Go 的 bug,是 Unix 系统级行为:os.Mkdir(path, perm) 的实际权限 = perm &^ umask。你的 shell 默认 umask 很可能是 0022,所以 0777 &^ 0022 == 0755。
- 别用
syscall.Umask(0)临时清 umask——它影响整个进程,线程不安全,还可能干扰其他 goroutine - 稳妥做法:先
os.MkdirAll创建目录,再用os.Chmod补权限,例如os.Chmod(path, 0777) - 如果目标是让目录“所有人可写”,得确认父目录也有对应
x权限(Linux/macOS 进入目录需执行位)
go run 在 /tmp 下执行失败,提示 fork/exec: permission denied
大概率是 /tmp 被挂载为 noexec,这是常见安全策略。Go 编译临时文件时默认用系统 TMPDIR,而 /tmp 不允许执行。
- 建一个用户目录下的临时区:
mkdir -p $HOME/tmp,然后chmod 700 $HOME/tmp - 导出环境变量:
export TMPDIR=$HOME/tmp(加到~/.bashrc或~/.zshrc永久生效) - 验证是否生效:
go env | grep TMPDIR应显示你的路径 - 注意:Windows 上不用管这个,但 WSL2 用户要同步检查 Linux 侧的挂载选项
GOPATH 和 GOBIN 的路径必须全程落在用户可写区域,且不能依赖任何系统级路径;umask 和 noexec 是操作系统层的隐形开关,Go 只是忠实执行——绕过它们不是修复,而是掩盖真正的问题边界。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










