应直接从 go.dev 下载二进制包安装:解析 https://go.dev/VERSION?m=text 获取最新版,下载对应 tar.gz 解压至 /usr/local,软链 /usr/local/go,配置 GOROOT=/usr/local/go、PATH 和 GOPATH,并写入 /etc/profile.d/go.sh 全局生效。
直接用 curl 下载官方二进制包解压到 /usr/local,再配好 PATH 和 GOPATH 就够用了——不需要包管理器、不推荐源码编译、别碰系统仓库里的老旧版本。
apt install golang 或 brew install go
Ubuntu/Debian 仓库中 golang 包通常滞后 2–3 个主版本(比如系统给 1.18,而当前稳定版已是 1.22);brew 虽较新,但会把 Go 安装到用户目录(如 /opt/homebrew/Cellar/go/1.22.0),路径不标准,CI/CD 中易出兼容问题。自动化脚本必须控制安装位置和环境变量作用域。
GOROOT 显式声明,某些工具链(如 go install 带 @latest)行为异常go env GOROOT 指向 Cellar 子路径,升级时硬链接断裂,go 命令可能静默失效https://go.dev/dl/ 发布的 tar.gz 包核心是解析 https://go.dev/VERSION?m=text 获取最新版号,再拼出下载 URL;解压后用 ln -sf 建软链保证 /usr/local/go 始终指向当前版本,避免手动改路径。
#!/bin/sh
GO_VERSION=$(curl -s https://go.dev/VERSION?m=text)
GO_URL="https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
# 替换为 arm64:go${GO_VERSION}.linux-arm64.tar.gz
curl -sL "${GO_URL}" | sudo tar -C /usr/local -xzf -
sudo ln -sf /usr/local/go/bin/* /usr/local/bin/
写入 /etc/profile.d/go.sh(对所有用户生效)
cat > /tmp/go.sh <<'EOF'
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
EOF
sudo mv /tmp/go.sh /etc/profile.d/go.sh
sudo chmod +x /etc/profile.d/go.sh
curl -sL 避免进度条干扰管道;tar -C /usr/local -xzf - 直接解压到目标位置sudo tar -xzf go*.tar.gz -C /usr/local —— 多数 tar 包顶层是 go/ 目录,但部分镜像站打包不规范,直接解压可能污染 /usr/local
/etc/profile.d/ 下的脚本比修改 /etc/profile 更安全:不破坏原有逻辑,且支持按需加载运行脚本后,新开终端执行 go version 应输出正确版本;若仍显示旧版或报 command not found,大概率是 shell 启动文件未重载或 /usr/local/bin 不在 PATH 中。
立即学习“go语言免费学习笔记(深入)”;
echo $PATH | grep '/usr/local/bin' —— Ubuntu 默认不含该路径,需确认 /etc/environment 或用户 ~/.profile 已包含 PATH="/usr/local/bin:$PATH"
go env GOROOT 必须输出 /usr/local/go;若为 /usr/lib/go,说明系统包残留未清理:sudo apt remove golang-go golang-src
--privileged 或确保 /usr/local 可写;Alpine 镜像无 curl
,先 apk add curl
真正麻烦的不是下载和解压,而是确保 GOROOT 硬编码路径与 PATH 中 bin 目录严格匹配,且所有子 shell 都能继承——任何一步绕过标准路径约定,后续 go mod vendor、cgo 或交叉编译都会突然卡住。