初学go遇到的问题,希望对各位初学者有所帮助~
问题描述
我下载了1.22.0版本的go,在bashrc中添加:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export GOPROXY=https://goproxy.cn,direct
export GO111MODULE=on
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
在Goland编译器中的setting中为GOROOT选择了1.22.0版本的SDK。就正常开始开发项目,在项目目录下执行go,可能是其他包需要更高版本的go,系统自动下载了go download 1.25.3的版本。
然后我发现 go env 和 bashrc配置出现了不一致,bashrc的GOROOT=/usr/local/go,go env的GOROOT:
bash
~/workspace/Project1204/backend/customer$ go env GOROOT
/home/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.3.linux-amd64
我希望想要它们处于相同的版本,我去手动修改go.mod的go版本为1.22.0,但是修改完编译器会自动帮我升级,然后重置我的go.mod的go版本为1.25.3。

问题原因
1.为什么编译器的go版本会自动升级
因为当前的go版本不满足一些包的版本要求,需要更新go版本。
2.为什么明明装了go,在项目目录中执行go却还要重新下载
go识别出了这是一个go项目,这个项目里有一个go.mod文件,里面说明了这个项目使用的go版本,所以为了适配,会自动下载该版本的go。
解决方法:自己下载对应版本的go,或者把go.mod中的go版本改为自己已经安装的go版本。
2.为什么bashrc和go env的GOROOT不一致
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/), 然后用这个缓存副本去编译。
因此虽然我系统安装的Go: /usr/local/go (1.22.0版本),
但实际使用的Go:/home/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.3.linux-amd64 (1.25.3版本)
问题解决
最终办法就是,下载一个满足各个包版本要求的版本v1的go,在项目的go.mod中,指定这个版本v1,此时再执行go env $ROOT,就会找到这个v1版本的go,而不是toolchain...的go。
~/workspace/Project1204/backend/customer$ go version
go version go1.25.3 linux/amd64
参考:为什么明明装了go,在项目目录中执行go却还要重新下载 go安装第三方库时改变了mod文件的go版本和toolchain版本