Go的env和bashrc的GOROOT配置不同

初学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版本

相关推荐
Scott9999HH6 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
Yana.nice7 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
DFT计算杂谈10 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区10 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang