最稳妥的多版本Go管理方案是gvm,它专为Go设计、轻量且专注;安装后需source配置文件才能使用,编译依赖系统工具链,国内用户应配置GVM_GOPROXY,GOPATH/GOBIN需手动统一,卸载前须确认项目依赖。
直接用 gvm(Go Version Manager)最稳妥,它专为多版本 Go 设计,比手动改 GOROOT 或软链接更可靠,也比 asdf 更轻量、Go 场景更专注。
gvm 安装后会提示你把初始化命令加到 shell 配置文件里,比如:
source ~/.gvm/scripts/gvm。但很多人装完就直接运行
gvm list,结果报错 command not found: gvm——因为当前终端没加载脚本。常见位置是 ~/.bashrc、~/.zshrc,加完记得 source ~/.zshrc(或对应文件),否则所有后续操作都无效。
gvm 安装 Go 源码并本地编译,对系统工具链有要求:
xcode-select --install)build-essential(Ubuntu/Debian)或 gcc + make(CentOS/RHEL)Fetching https://github.com/golang/go/archive/go1.21.6.tar.gz,建议提前配置代理或使用 GVM_GOPROXY=https://goproxy.cn 环境变量执行安装:
gvm install go1.21.6,成功后会自动设为当前版本;若要安装但不切换,加
--no-default 参数。
gvm 切换版本时默认会重置 GOROOT 和 PATH,但 GOPATH 和 GOBIN 不会自动变——它们通常由用户自定义,且应保持跨版本一致(否则 go install 的二进制可能混在不同版本的 bin/ 下)。确认方式:
go env GOPATH GOBIN GOROOT
推荐做法是:全局只设一个 ~/go 作为 GOPATH,并在 ~/.gvm/scripts/functions 中确认没有覆盖逻辑;如需 per-version GOBIN,得自己用 alias 或 wrapper 处理,gvm 不原生支持。
用 gvm list 可看到带星号(*)的当前版本,以及所有已安装版本。执行 g 会彻底删除该版本源码和编译产物。但要注意:
go.mod 明确写了 go 1.19,而你删了所有 1.19.x,go build 可能因找不到匹配工具链失败(尤其 CI 或他人复现时)gvm use 是临时切换,只影响当前 shell;gvm default 才设全局默认,退出再进新终端也会生效真正麻烦的不是切换,而是团队协作中各人 gvm default 不一致,又没在 README 写明最低 Go 版本——这种隐性依赖,比版本装不上更难排查。