适合日常开发,但需手动配置gopath和path;pacman安装的go二进制可用,但默认无gopath、不设gobin,导致go mod和go install失败,须在shell配置中添加export gopath=$home/go和export path=$path:$gopath/bin。

pacman 安装的 go 包是否适合日常开发?
可以,但默认安装的是系统级 go,不带 GOPATH 自动初始化,也不设 GOBIN,直接用会报 command not found: go 或 cannot find module providing package —— 不是没装好,是环境没接上。
Arch 的 go 包(来自 community)编译自上游源码,版本紧随官方发布,比手动下载二进制更省心;但它不会自动写入 /etc/profile.d/ 或修改用户 shell 配置,这点和 Ubuntu 的 apt install golang 行为不同。
- 装完立刻验证:
go version能输出即说明二进制可用 - 但
go env GOPATH默认是空的,go mod init会失败,因为模块根目录检测依赖GOPATH或当前路径含go.mod - 别改
/usr/bin/go权限或软链到别处——pacman 管理的包被篡改后下次升级可能冲突
如何让 go 命令和模块系统正常工作?
关键就两步:设 GOPATH、把 $GOPATH/bin 加进 $PATH。Arch 不强制你用 ~/go,但这是最省事的路径,也符合 Go 官方推荐。
在你的 shell 配置里(比如 ~/.zshrc 或 ~/.bashrc)加这两行:
export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
然后重载配置:source ~/.zshrc。再运行 go env GOPATH 应该输出 /home/yourname/go,go install example.com/cmd/hello@latest 才能真正把可执行文件落到 $GOPATH/bin 下并直接调用。
- 如果用
fish,语法是set -gx GOPATH $HOME/go和set -gx PATH $PATH $GOPATH/bin - 别把
GOPATH设成/tmp或 root 目录——go get会尝试写入,权限或清理策略会导致失败 -
go mod项目不需要GOPATH,但go install带@version的命令仍依赖它来存二进制
升级 go 时要注意什么?
pacman 升级 go 是原子替换二进制,但不会动你本地的 $GOPATH 内容,所以已下载的 module 缓存($GOPATH/pkg/mod)和编译产物都保留。这很安全,但也带来一个隐性问题:旧版 go 编译的 .a 文件可能和新版不兼容。
升级后如果遇到 cannot load package: package ...: cannot find module providing package,大概率是缓存脏了。
- 先跑
go clean -modcache清掉模块缓存,再go mod download重拉一遍 - 如果用
go build -i(已弃用但老项目可能还有),得删掉$GOPATH/pkg下对应平台目录 - 不用手动删
$GOPATH/src——那是你放自己代码的地方,pacman 从不碰它
为什么 go run main.go 有时报错找不到包,但 go build 没问题?
这不是 Arch 特有,而是 Go 1.16+ 启用 GO111MODULE=on 默认行为后,go run 对当前目录是否在 module 根下更敏感。pacman 安装的 go 默认开启模块模式,但没帮你初始化 go.mod。
现象:你在任意目录写个 main.go,里面 import 了 "fmt",go run main.go 报错说找不到 fmt —— 实际是 Go 尝试按模块方式解析,发现没 go.mod,又不在 GOPATH/src 下,就放弃标准库之外的所有查找逻辑。
- 解决方法只有两个:
go mod init dummy初始化一个临时模块,或者确保文件在$GOPATH/src/xxx/yyy下(不推荐) -
go build成功是因为它只检查语法和标准库,不触发模块加载流程 - 想全局关闭模块模式?设
GO111MODULE=off,但会失去go.mod管理能力,不建议
go 就能直接 go run,结果卡在第一行 import 上。










