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

相关推荐
程序员老舅10 分钟前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
雨中风华23 分钟前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
季明洵25 分钟前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
墨雪不会编程32 分钟前
C++之【深入理解Vector】三部曲最终章
开发语言·c++
浅念-39 分钟前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
小宋10211 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
爱吃生蚝的于勒1 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森1 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
翼龙云_cloud1 小时前
腾讯云代理商: Linux 云服务器搭建 FTP 服务指南
linux·服务器·腾讯云
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql