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

相关推荐
QQ12154614681 分钟前
Linux CentOS 7配置 Tomcat 系统服务
linux·centos·tomcat
沐知全栈开发2 分钟前
Scala 数组
开发语言
jiayong232 分钟前
Word 使用指南:标题间距调整与核心功能详解
开发语言·c#·word
游戏23人生3 分钟前
c++ 语言教程——17面向对象设计模式(六)
开发语言·c++·设计模式
SMF19193 分钟前
【FTP服务器】Linux(Centos)系统搭建FTP服务器(可根据账号独立配置每个账号的ftp地址)
linux·服务器·centos
superman超哥4 分钟前
仓颉内存管理内功:栈与堆的分配策略深度解析
c语言·开发语言·c++·python·仓颉
Evand J4 分钟前
【MATLAB例程】GNSS高精度定位滤波的例程分享,使用维纳滤波+多频段加权融合,抗多径、延迟等带来的误差
开发语言·matlab·gnss·北斗·滤波·维纳滤波·bds
极客先躯8 分钟前
java的线上诊断工具大全
java·大数据·开发语言·内存管理·生产·诊断工具
MyBFuture14 分钟前
C# 二进制数据读写与BufferStream实战
开发语言·c#·visual studio
川石课堂软件测试14 分钟前
软件测试的白盒测试(二)之单元测试环境
开发语言·数据库·redis·功能测试·缓存·单元测试·log4j