go安装第三方库时改变了mod文件的go版本和toolchain版本
1.解释
发生这种情况,是因直接或者间接依赖的第三方库,所要求的golang版本高于本地版本.
可以看看下面的这个文档, 里面对当前go mod工具链做了描述:
https://golang.ac.cn/doc/toolchain
大致意思是:
go 1.21之后, mod文件中, "go"指令指的是项目要求的最低golang版本, "toolchain"指令是显式指定编译时使用的工具链版本.
优先级:toolchain指令 > go指令 > 本地安装版本
当mod文件中, 存在"toolchain"指令时, 优先使用其版本作为目标"toolchain"版本, 若不存在, 则隐式使用"go"指令版本作为目标"toolchain"版本.
当目标"toolchain"版本与本地版本一致时, 则直接使用本地的"toolchain"来编译.
当目标"toolchain"版本高于本地版本时, 则会自动下载并缓存相应的"toolchain"副本(存放目录是:$GOPATH/pkg/mod/cache/download/golang.org/toolchain/), 然后用这个缓存副本去编译.
不管是哪种情况, 都不会覆盖本地的全局golang安装, 也就不会直接影响其他项目.
如果不希望自动下载高版本"toolchain", 可以将环境变量"GOTOOLCHAIN"改为"local", 不过这样的话, 不升级golang版本大概率是编译不通过的.
2. 参考方案1, 多版本golang (个人项目推荐)
可以用golang多版本管理工具来做管理, 比较流行的是:GVM(地址:https://github.com/moovweb/gvm).
在开发不同项目的时候,使用不同的golang本地版本, 也就摒弃了上面的"自动行为".
3.参考方案2, 找依赖库的旧版本 (公司生产项目推荐)
在生产环境中, 往往不希望golang自动下载工具链, 影响编译速度, 那就只能找依赖库的旧版本, 看能不能直接兼容当前的go版本.
查询golang第三方库发布时间线的地址:
https://pkg.go.dev/
技巧就是比对go版本发布时间与依赖库版本发布时间,
依赖库版本发布时间在本地go版本和本地go版本的下个版本发布时间之间, 大概率就没问题.