您现在的位置是:亿华云 > 知识
Go 将引入标准库 v2 版本,首个动手的是:math/rand/v2!
亿华云2025-10-04 03:00:53【知识】8人已围观
简介来源:脑子进煎鱼了大家好,我是煎鱼。最近 Go 核心团队负责人 @Russ Cox下称:rsc)发起了一项 “讨论”。希望正式开启 Go 标准库的 v2 版本,相当于老树发新芽了。Go 标准库升级 v
来源:脑子进煎鱼了
大家好,将引我是入标煎鱼。
最近 Go 核心团队负责人 @Russ Cox(下称:rsc)发起了一项 “讨论”。准库希望正式开启 Go 标准库的版本首 v2 版本,相当于老树发新芽了。个动

Go 标准库升级 v2 原因
这次会发起这个提案的最直接原因是:我们(指的 Go 团队)要清理 math/rand 标准库的脏乱差,修复许多挥之不去的入标问题,特别是准库使用过时的生成器、缓慢的版本首算法(性能),以及与 crypto/rand.Read 的个动不幸冲突。
间接且重要的将引原因是:
为标准库中的其他 v2 包树立一个榜样。创建 math/rand/v2 可以让我们在一个相对较少使用的入标包中解决工具问题(gopls、goimports 等工具对 v2 包的准库支持)。后续要对更常用、版本首风险更高的个动包(如:sync/v2 或 encoding/json/v2)进行新版本迭代,先以 math/rand/v2 来升级,风险低很多。源码库总结一下,三点:
标准库里的 math/rand 和其他包的老毛病和待提高的地方太多了。Go1 要求兼容性保障,没法直接改。我们要推动标准库的 v2 版本升级。math/rand 问题清单
那针对 math/rand 本身有哪些问题呢,rsc 也拉了一份清单,证明本次升级 v2 版本的原因和计划改造的地方。
对于完整实现感兴趣的同学可以查看 502506: math/rand/v2: delete Mitchell/Reeds source[1]:

以下是快速概览:
删除 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) *PCGtype PCG struct{ ... }
func (p *PCG) Uint64() uint64func (p *PCG) Seed(seed1, seed2 uint64)删除 Mitchell & Reeds LFSR 生成器和 NewSource。总结
Go 近年在推动了 Go1 向前向后兼容性保障和策略后,似乎正期望在对既有的源码下载组件们进行大修整。
这次 math/rand 将会打响的 Go 标准库 v2 升级的前哨战。后续 sync/v2 和 encoding/json/v2 也陆续有来。值得期待!
但是最近我关注到,现在 Go 较大的东西基本都是 rsc 在推动和改造。不知道 Go 核心团队是否也出现了一些青黄不接?这是一个值得担忧的点。
参考资料
[1]502506: math/rand/v2: delete Mitchell/Reeds source: https://go-review.googlesource.com/c/go/+/502506
很赞哦!(6382)
相关文章
- 如果你的潜在终端必须是这个米(域名),那么潜在终端并不多,也没有硬通货,那么你的域名应该在终端有兴趣购买时出售。否则,你可能得自己留着吃。
- 你们都是怎么学Python的?
- 如何在Linux上安装Java?
- 一款不用写代码,简单,高效的开源自动化测试工具
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
- React VS Vue:谁会成为2020年的冠军?
- New一个对象的时候发生了什么?
- Python 最强 IDE 详细使用指南!
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
- 从把三千行代码重构成15行代码谈起