新老项目很多,怎么进行 golang 的版本控制?
这边推荐两个库(非推广)
golang 多版本 下载删除 管理
github.com/fsgo/smart-go-dl
自动切换 go 执行的二进制文件
github.com/fsgo/bin-auto-switcher
效果如图
bin-auto-switch go 版本是 go1.22
ddns-go go 版本是 go1.20
直接运行 go 命令就能直接使用

除此之外,vscode goroot 的配置我感觉是有问题的,哪怕我配置了 go.root 为 1.21 的目录 ,只要我默认的版本是 go1.20 ,那么我的 maps 就一直会报错(maps 为 go1.21 新增)
bin-auto-switch 本质是替换了 go 的命令,然后通过读取各种配置,比如 go.mod 去判断应该执行的 go 的版本
自从用了 bin-auto-switch 之后,除了牺牲执行时的一些性能损耗,用起来非常丝滑,代码提示和代码跳转都没有问题,都能自动切到对应的版本。
最后,俺的博客 blog.twelveeee.top/2025/Go/go_version_control/ 记录了这两个项目的用法(虽然这两个项目的 readme 都很完整)(涨涨 pv 谢谢!)

go.mod 里面添加一行 toolchain go1.24.0 不就能自动切换了吗?

没听懂,你是在用 go1.20 的编译器,引用 1.21 目录里的标准库 maps 来编译吗?你这么做的目的是啥?

我个人:

  1. 本地 go 用最新
  2. 很少用新版新特性
  3. 如果需要测试,命令行走起, go.dev/doc/manage-install

    那我这半年吃过的苦算什么 TAT

主要是 golang 版本和项目的版本不对的话,vscode 会报错并且没有代码提示和跳转

正常运行命令 go1.21 run main.go 还是能运行的,开发起来比较痛苦。

管理 本地工具链吗?, asdf 啊

啊? java 的裹脚布传统也要带过来吗

go 版本难道不是有新的就升?哦,字节跳动除外。

有这个必要吗?部署都是用 docker ,要用什么版本 dockerfile 里面指定就行了,啥时候打不出包了就看看日志换个 build image

vscode 指定 "GOROOT": "\[email protected]"

用 asdf 吧,自己多去研究下

用 mise ,更快版本的 asdf

我用的 gvm 。不过一般本地用最新的

update-alternative??

go 兼容性那么好,不用新的傻吗,赶紧升级 1.24map 性能有优化

有些要支持 win7 或 2008 ,不得不 1.20 吧

用 go1.20 的,添加这句不行吧

go1.21 新增的功能,需要本机安装的版本在 1.21 或以上才能识别这个指令,代表本模块所需使用的工具链

也可以用 GOTOOLCHAIN=go1.18 go run . 强行指定编译使用的版本

详情可见: go.dev/blog/toolchain

go 这种升个版本和喝水一样的东西对多版本管理要求倒也没那么大。我们公司 go 有的项目最新版的大版本一出本地和开发测试环境就原地升到最新版,然后过个半年左右生产环境也升到最新版。小版本基本上是公布后有人注意到生产环境就顺便升了

👀又不是 java ,golang 随便升啊

感谢各位大佬,学到了!

至于为什么不升级 go 的版本,有些项目不是我们团队负责的,我就上去加一两行代码。

升级完了 golang 版本还要去改 makefile ,还要担心上线出了问题,所以还是保留原状,不升的好。

没记错,golang 是高版本向下兼容的,而且编译方式都是静态编译,相当于基本上所有依赖都是有源码。直接升工具链没啥问题吧

好主意。回头我实现一下我写的 GVM 工具。加个 switch
img

造轮子的时候就要降版本号了