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

相关推荐
freexyn1 小时前
Matlab自学笔记六十九:多项式求值、求根、积分和求导
开发语言·笔记·matlab
灵犀坠1 小时前
前端高频知识点汇总:从手写实现到工程化实践(面试&开发双视角)
开发语言·前端·javascript·tcp/ip·http·面试·职场和发展
郝学胜-神的一滴1 小时前
Linux中的alarm函数详解:定时器信号处理指南
linux·服务器·开发语言·c++·程序人生
了一梨1 小时前
Docker基础使用
linux·docker·容器
iナナ1 小时前
Java自定义协议的发布订阅式消息队列(一)
java·开发语言·spring·消息队列·生成消费者模型
方也_arkling1 小时前
【JS】日期对象及时间戳的使用(制作距离指定日期的倒计时)
开发语言·javascript·ecmascript
shizhan_cloud1 小时前
Shell 脚本的条件测试与比较
linux·运维
Zfox_1 小时前
【Go】反射
开发语言·后端·golang
郝学胜-神的一滴1 小时前
Linux kill命令与kill函数:从信号原理到实战解析
linux·服务器·开发语言·c++·程序人生