Go 将引入标准库 v2 版本,首个动手的是:math/rand/v2!

大家好,我是煎鱼。

最近 Go 核心团队负责人 @Russ Cox(下称:rsc)发起了一项 “讨论”。希望正式开启 Go 标准库的 v2 版本,相当于老树发新芽了。

f2554cdefb40e85047f84e07d2c8f1ba.png

Go 标准库升级 v2 原因

这次会发起这个提案的最直接原因是:我们(指的 Go 团队)要清理 math/rand 标准库的脏乱差,修复许多挥之不去的问题,特别是使用过时的生成器、缓慢的算法(性能),以及与 crypto/rand.Read 的不幸冲突。

间接且重要的原因是:

  • 为标准库中的其他 v2 包树立一个榜样。创建 math/rand/v2 可以让我们在一个相对较少使用的包中解决工具问题(gopls、goimports 等工具对 v2 包的支持)。

  • 后续要对更常用、风险更高的包(如:sync/v2encoding/json/v2)进行新版本迭代,先以 math/rand/v2 来升级,风险低很多。

总结一下,三点:

  1. 标准库里的 math/rand 和其他包的老毛病和待提高的地方太多了。

  2. Go1 要求兼容性保障,没法直接改。

  3. 我们要推动标准库的 v2 版本升级。

math/rand 问题清单

那针对 math/rand 本身有哪些问题呢,rsc 也拉了一份清单,证明本次升级 v2 版本的原因和计划改造的地方。

对于完整实现感兴趣的同学可以查看 502506: math/rand/v2: delete Mitchell/Reeds source[1]

a420c7426878c2d658d8d3cf142b3e34.png

以下是快速概览:

  • 删除 Rand.Read 和顶层的 Read。

  • 移除 Source.Seed、Rand.Seed 和顶层 Seed。(意味着像 Int 这样的顶层函数将总是随机播种)

  • 移除 Source64,现在 Source 提供了 Uint64 方法,原有的方法没有必要存在了。

  • 在 Float32 和 Float64 中使用更直接的实现。以 Float64 为例,它最初使用 float64(r.Int63()) / (1<<63)。但这有一个问题,就是偶尔会四舍五入到 1.0,而 Float64 一定不会。我们期望改成 float64(r.Int63n(1<<53)) / (1<<53),这就避免了四舍五入的问题。

  • Rand.Shuffle 的方式实现 Rand.Perm。Shuffle 的效率更高一些,这样可以确保只有一个实现。

  • 将 Int31、Int31n、Int63、Int64n 更名为 Int32、Int32n、Int64、Int64n。这些名字是不必要的迂腐和混乱。

  • 添加 Uint32, Uint32n, Uint64, Uint64n, Uint, Uintn,将会是 Rand 上的顶级函数和方法。

  • 在 Intn, Uintn, Int32n, Uint32n, Int64n, Uint64n 中使用 Lemire 的算法。性能会有新的突破。

  • 添加一个新的 Source 实现,PCG-DXSM,包含以下 API:

func NewPCG(seed1, seed2 uint64) *PCG
type PCG struct { ... }
func (p *PCG) Uint64() uint64
func (p *PCG) Seed(seed1, seed2 uint64)
  • 删除 Mitchell & Reeds LFSR 生成器和 NewSource。

总结

Go 近年在推动了 Go1 向前向后兼容性保障和策略后,似乎正期望在对既有的组件们进行大修整。

这次 math/rand 将会打响的 Go 标准库 v2 升级的前哨战。后续 sync/v2encoding/json/v2 也陆续有来。值得期待!

但是最近我关注到,现在 Go 较大的东西基本都是 rsc 在推动和改造。不知道 Go 核心团队是否也出现了一些青黄不接?这是一个值得担忧的点。

推荐阅读

参考资料

[1]

502506: math/rand/v2: delete Mitchell/Reeds source: https://go-review.googlesource.com/c/go/+/502506

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

99a9f5f1cce7806b7716da6ecbcdef86.jpeg

2926163f0a7351aeea77c678e9baec95.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

<think>好的,我现在需要解决用户遇到的Golang错误:“package slices is not in GOROOT (/usr/local/go/src/slices)”。用户已经提供了一些相关的引用内容,我需要结合这些信息来找到解决方案。 首先,我回忆一下Golang的包管理机制。在Go 1.11之后引入Go Modules来替代旧的GOPATH方式。用户提到的GO111MODULE环境变量是关键,它控制模块支持的模式。引用[2]和[3]都提到,当GO111MODULE设置为on时,会启用模块支持,而模块的管理是通过go.mod文件进行的。如果项目没有正确初始化模块,可能会导致找不到包的错误,尤其是像slices这样的新包。 接下来,查看错误信息中的具体包。用户的问题涉及slices包,这个包属于较新的Go版本。例如,Go 1.18引入了slices包作为标准库的一部分。因此,如果用户的Go版本低于1.18,那么标准库中确实不会有这个包,导致编译错误。需要确认用户的Go版本是否符合要求。 另外,错误中还提到了其他包如cmp、math/rand/v2、net/netip,这些可能也是较新的包或位于实验性路径下。例如,math/rand/v2可能是在Go 1.20或更高版本引入的。如果用户使用的Go版本较旧,这些包自然无法找到。 解决方案方面,引用[4]提到使用go mod初始化项目,这可能解决模块管理的问题。同时,需要确保Go版本升级到支持这些包的版本。步骤可能包括: 1. 检查并升级Go版本到至少1.18或更高,以支持slices包。 2. 确认GO111MODULE设置为on,并初始化模块。 3. 运行go mod tidy来同步依赖。 此外,用户可能需要更新项目依赖,确保第三方库兼容当前Go版本。例如,quic-go可能要求较新的Go版本,如果用户的项目依赖旧版库,可能需要升级依赖。 需要提醒用户注意版本兼容性,并正确设置模块管理,避免GOPATH与模块冲突。同时,确保所有依赖项在go.mod中正确列出,并通过go get命令获取最新版本。</think>针对`package slices is not in GOROOT`的Go语言编译错误,以下是分步解决方案: --- ### 错误原因分析 1. **Go版本过低**:`slices`包是Go 1.18+新增的标准库[^3],若Go版本低于此会直接报错 2. **模块管理未启用**:未正确初始化Go Modules导致依赖解析失败[^4] 3. **依赖版本冲突**:第三方库(如`quic-go`)可能依赖新版Go特性[^1] --- ### 具体解决步骤 #### 第一步:升级Go版本 ```bash # 检查当前版本 go version # 若版本 <1.18,需升级(以Ubuntu为例) sudo rm -rf /usr/local/go wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz ``` #### 第二步:初始化Go Modules ```bash # 进入项目目录 cd /your/project/path # 初始化模块(项目名需符合命名规范) go mod init your_project_name # 示例:go mod init github.com/username/repo ``` #### 第三步:同步依赖 ```bash # 清理无效依赖 go mod tidy # 强制更新依赖树 go clean -modcache go get -u ./... ``` #### 第四步:检查环境变量 ```bash # 确认模块支持开启 go env -w GO111MODULE=on # 强制启用Go Modules模式[^2] # 验证配置 go env | grep -E 'GO111MODULE|GOPATH' ``` --- ### 补充说明 1. **第三方库适配**:若仍报错`quic-go`或`golib`相关错误,尝试: ```bash go get -u github.com/quic-go/quic-go@latest go get -u github.com/fatedier/golib@latest ``` 2. **构建命令调整**:建议使用标准构建命令: ```bash go build -o output_name main.go ``` --- ### 典型错误场景示例 ```bash # 错误场景:未初始化mod时直接构建 $ go build client/admin_api.go:18:2: package cmp is not in GOROOT... # 正确操作流程 $ go mod init demo $ go mod tidy $ go build # 成功编译 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值