一键安装go需同时配置/etc/profile.d/go.sh和/etc/environment,设goroot=/usr/local/go、gopath=~/go,显式设置cgo_enabled=0、goproxy和gosumdb,并校验go env、go mod tidy及go test权限。

用 shell 脚本一键安装 Go 并配置 GOPATH 和 GOROOT
直接改 /etc/profile 或 ~/.bashrc 很容易漏掉非交互式 Shell 场景(比如 CI 中的 sudo -u user sh -c 'go version'),导致脚本里执行 go 命令报 “command not found”。必须同时写入登录 Shell 的 profile 文件和非登录 Shell 的环境变量文件(如 /etc/environment)。
实操建议:
- 下载官方二进制包(不要用系统包管理器装,
apt install golang版本老旧且不设GOROOT) - 解压到
/usr/local/go,设GOROOT=/usr/local/go -
GOPATH推荐设为~/go,但需确保该目录存在且当前用户有写权限 - 在
/etc/profile.d/go.sh中写入export语句(比修改/etc/profile更干净、可卸载) - 对 systemd 用户服务或 cron,额外在
/etc/environment补PATH和GOROOT(它不支持export,只认KEY=VALUE格式)
检查 go env 输出是否符合预期,尤其注意 GOBIN 和 CGO_ENABLED
go env 显示的值不等于你 export 的值?常见原因是子 Shell 没重载,或 go 命令本身被 alias 覆盖(比如 alias go='time go')。更隐蔽的问题是:某些 CI 环境(如 GitHub Actions 的 ubuntu-latest)默认启用 CGO_ENABLED=1,但交叉编译时会失败。
实操建议:
- 脚本末尾加
go env | grep -E '^(GOROOT|GOPATH|GOBIN|CGO_ENABLED)$'做断言校验 - 若需静态编译(如部署到 Alpine),在脚本中显式设置
CGO_ENABLED=0,并验证go build -ldflags '-s -w' -o myapp .是否生成无依赖二进制 -
GOBIN不要设为空或.,否则go install会覆盖当前目录下的同名文件;推荐设为$GOPATH/bin并确保已加入PATH
自动初始化 go mod 并校验代理与校验和
公司内网或 CI 环境常因 GOPROXY 或 GOSUMDB 导致 go mod download 卡住或校验失败,但错误信息藏在 go list -m all 里,脚本里不主动触发就发现不了。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
实操建议:
- 脚本中运行
go mod init example.com/test创建最小模块,再立即执行go mod tidy -v触发依赖解析 - 提前设好代理:
go env -w GOPROXY=https://goproxy.cn,direct(国内)或https://proxy.golang.org,direct(海外) - 若禁用校验和数据库(如离线环境),必须配
go env -w GOSUMDB=off,否则go get会 hang 住等待 sum.golang.org 响应 - 用
go list -m -f '{{.Dir}}' std快速验证标准库路径是否可读,避免后续构建时报 “cannot find package”
验证 go test 在自动化流程中是否真正可用
很多脚本只测 go version 和 go env,但没跑真实测试——结果 CI 里 go test ./... 报 fork/exec /tmp/go-build.../a.out: permission denied,原因是 tmpfs 挂载了 noexec。
实操建议:
- 脚本末尾加一个极简测试:
echo 'package main; func TestX(t *testing.T) {}' > t_test.go && go test -v t_test.go - 若失败且错误含
permission denied,说明$TMPDIR所在分区挂载了noexec,需改用go test -toolexec 'sh -c "chmod +x $2 && $2"'绕过(不推荐长期用,仅调试) - Go 1.21+ 默认启用
GOROOT/src/testing的新行为,老脚本若用go test -i(已废弃)会失败,直接删掉
环境变量写入位置、代理策略、临时目录权限——这三个点不显眼,但只要一个没覆盖,自动化脚本在真实流水线里就会静默失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










