背景:公司项目很多,有些是老框架,有些是新框架,有些项目用的go的老版本,有些用的是go的新版本,难免会出现一些不兼容的意外情况,对于开发者,如何去丝滑切换go的版本就变成刚需。

1.GOROOT

GOROOT就是我们go的位置;go版本的切换,本质就是就是不同版本的go的GOROOT的切换。

2.GOENV

环境搭建时,我们常常会用 ``go env -w GO111MODULE=on类似的命令去配置,这样的自定义配置就会写入GOENV这个变量所在的文件中,mac下:/Users/[username]/Library/Application Support/go/env`

GOPROXY=https://goproxy.cn,direct
GO111MODULE=on

# go1.20.14
GOPRIVATE=git.randyfield.tech
GOROOT=/usr/local/go

# # go1.22.3
# GOPRIVATE=git.randyfield.tech
# GOROOT=/Users/randyfield/Desktop/go/go

想必看到上面的env内容的童鞋已经能大概能够想到:直接在这里改变go的版本以切换,是否可行?

答案:可行。但是因为在vscode的终端执行了go version ,版本经常没有得到变更,通过echo $PATH也发现vscode环境变量没有变化,重新加载插件的操作可能会改善这样的情况,但是依然会有切换失败的情况,另外,上述所有语境都是在vscode的终端下执行。而且我这边为了排除系统环境变量的干扰,已经把系统环境变量中的go都移除了,全方面依赖vscode自己去加载环境变量至内置终端。所以对于这个不完全靠谱的方法,个人建议直接摒弃。

3.最佳实践

同样,系统环境变量中不存在go的path。直接在项目中增加.vscode/settings.json

{
	// "go.goroot": "/Users/randyfield/Desktop/go/go", // go1.22.3
	"go.goroot": "/usr/local/go", // go1.20.14
}

添加修改后,记得强制保存一次,立竿见影。image-20240715161041761

此时终端也会出现感叹号: image-20240715161207989

重启或新建终端即可