应直接安装官方二进制包至 /usr/local/go 并配置 path 和 goproxy;ubuntu 22.04 自带的 go 1.18 过旧,不支持 embed、泛型改进等特性,且与 go.mod 声明版本冲突;系统包管理器安装路径受限、升级滞后、无法多版本共存;arm64 服务器须选 linux-arm64.tar.gz;环境变量需通过 /etc/profile.d/golang.sh 全局生效,确保 goroot 正确;gopath 建议设为 $home/go;国内必须设置 goproxy=https://goproxy.cn,direct,私有模块需配置 goprivate 和 goinsecure;验证不能仅靠 go version,须实测 go mod init → go build → 运行闭环;docker 和 systemd 中易遗漏 path 配置,导致命令或代理失效。

直接装官方二进制包到 /usr/local/go,配好 PATH 和 GOPROXY,其他都是干扰项。
为什么不用 apt install golang
Ubuntu 22.04 自带 go1.18,而当前稳定版已是 go1.22.5;go1.18 不支持 embed、泛型改进、io.ReadAll 的错误处理优化等关键特性,且 go.mod 中声明 go 1.21 会直接报错 go: go.mod file not found in current directory or any parent(实际是版本不匹配触发的 fallback 失败)。系统包管理器还把 go 装到 /usr/lib/go,权限受限、升级需等发行版更新、无法与新版共存。
- 别信“能跑就行”——CI 构建失败、依赖拉不到、
go run报奇怪的cannot find module,八成是版本太旧或GOROOT错乱 - ARM64 服务器(比如 AWS Graviton)必须选
linux-arm64.tar.gz,否则go version直接报cannot execute binary file: Exec format error
怎么配环境变量才真正生效
只改 ~/.bashrc 是最常见失效原因:systemd 服务、crontab、Docker 容器内、CI 脚本默认不加载用户 shell 配置,go 命令就找不见。必须让 GOROOT 和 PATH 对所有上下文可见。
- 新建
/etc/profile.d/golang.sh,写入:export GOROOT=/usr/local/go<br>export PATH=$GOROOT/bin:$PATH
- 执行
source /etc/profile.d/golang.sh,再验证:go env GOROOT输出必须是/usr/local/go(不能多斜杠、不能是软链接路径) -
GOPATH不再决定项目位置(Go 1.16+ 默认模块模式),但go install工具会默认放进$GOPATH/bin,建议设为$HOME/go并确保该目录存在:mkdir -p $HOME/go
国内服务器必设 GOPROXY,否则依赖卡死
不设代理时,go mod download 会直连 proxy.golang.org,超时后静默失败,错误常表现为:go: github.com/some/pkg@v1.2.3: reading github.com/some/pkg/go.mod at revision v1.2.3: unexpected EOF 或更隐蔽的 no matching versions for query "latest"。
- 立即运行:
go env -w GOPROXY=https://goproxy.cn,direct - 验证:
go env GOPROXY应输出完整字符串,不是空或https://proxy.golang.org - 如果私有模块在
git.example.com,追加:go env -w GOPRIVATE=git.example.com+go env -w GOINSECURE=git.example.com
验证不是只跑 go version
go version 成功只说明二进制能执行,不代表模块、构建、运行闭环可用。生产环境几乎全走模块流程,必须实测最小链路。
- 执行:
mkdir -p /tmp/hello && cd /tmp/hello && go mod init hello(生成go.mod) - 写
main.go:package main<br>import "fmt"<br>func main() { fmt.Println("ok") } - 跑通三步:
go mod download→go build -o hello .→./hello输出ok - 注意:Dockerfile 中常漏掉
ENV PATH=$PATH:/usr/local/go/bin,导致镜像里go命令不存在
最容易被忽略的是 GOPROXY 没设,以及 systemd 服务脚本里没显式指定 Environment="PATH=/usr/local/go/bin:/usr/bin"——这两处一出问题,现象就是“明明 go version 有,但 go build 就是拉不到依赖”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











