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

news2024/11/20 3:28:19

大家好,我是煎鱼。

最近 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 核心团队是否也出现了一些青黄不接?这是一个值得担忧的点。

推荐阅读

  • Go1.21 速览:新内置函数 clear、min、max 和新标准库包 cmp!

  • Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入标准库。。。

  • Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

参考资料

[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 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译原理笔记8:语法分析(2)上下文无关文法 CFG

目录 CFG 概述及其四元组表示产生式集合表示 CFGCFG&#xff0c;用推导&#xff0c;产生语言直接推导由 CFG 产生语言在&#xff1f;为啥从右往左叫规范&#xff1f;凭什么歧视左&#xff1f; 总结一下这些奇奇怪怪的东西 前几篇博客中说到的词法分析&#xff0c;做的是从 【xy…

驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库&#xff0c;用于存储系统和应用程序的设置信息&#xff0c;注册表是一个巨大的树形结构&#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用&#xff0c;而在内核中读写注册表则需要使用内核装用API函数&#xff0c;如…

Spring Cloud灰度部署

1、背景(灰度部署) 在我们系统发布生产环境时&#xff0c;有时为了确保新的服务逻辑没有问题&#xff0c;会让一小部分特定的用户来使用新的版本&#xff08;比如客户端的内测版本&#xff09;&#xff0c;而其余的用户使用旧的版本&#xff0c;那么这个在Spring Cloud中该如何…

第五届双态IT北京用户大会回顾 | 基于运维数据治理的数智化转型

专题演讲人&#xff1a;擎创科技CTO 葛晓波 文末附有本场专题演讲视频 ●前言 各行业的云原生发展程度各有不同&#xff0c;并不是所有业务应用都适合云原生的形态&#xff0c;如若过度追求云原生化反而会使得企业运维压力骤增&#xff0c;运维成本激增。 从数字化转型的角度…

软考:软件工程:软件定义,特点,软件生命周期,软件危机,软件开发模型

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

C++——vector容器模拟实现

目录 1. 基本成员函数 2. 默认成员函数 2.1 构造函数 2.2 析构函数 2.3 拷贝构造函数 2.4 赋值运算符重载函数 3. 容器访问相关函数 3.1 operator[ ]运算符重载 3.2 迭代器 3.3 范围for 4. vector空间增长问题 4.1 vector 容量和大小 4.2 vector扩容 4.3 重新定义…

均匀B样条采样从LiDAR数据中快速且鲁棒地估计地平面

文章&#xff1a;Fast and Robust Ground Surface Estimation from LiDAR Measurements using Uniform B-Splines 作者&#xff1a;Sascha Wirges, Kevin Rsch, Frank Bieder and Christoph Stiller 编辑&#xff1a;点云PCL 代码&#xff1a; https://github.com/KIT-MRT/poin…

全志V3S嵌入式驱动开发(编译器升级到7.5)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 看过我们文章的朋友都知道&#xff0c;前面为了做v3s的驱动&#xff0c;对linux kernel进行了两次升级。第一次升级是从4.10.y升级到4.14.y&#x…

【Python】open打开文件出现的错误解决

一、Python中关于打开open打开文件出现的错误解决 &#xff08;第一种&#xff09;UnicodeDecodeError: ‘utf-8’.......... &#xff08;第二种&#xff09;UnicodeDecodeError: ‘gbk’......... 二、问题解决 两种解决方式针对不同错误&#xff0c;实际应用中可以都试试…

PCB设计实验|第五周|LED显示电路PCB库设计|3月27日

目录 实验四 LED显示电路PCB库设计 一、实验原理 二、实验环境 三、实验结果 四、实验总结 实验四 LED显示电路PCB库设计 一、实验原理 LED(Light- Emitting-Diode中文意思为发光二极管)是一种能够将电能转化为可见光的半导体&#xff0c;它改变了白炽灯钨丝发光与节能…

裁剪图片软件有哪些?这些图片裁剪工具很好用

有哪些好用的图片裁剪软件呢&#xff1f;有时候&#xff0c;将一张大图缩小到更小的尺寸可以改善图片的质量&#xff0c;因为它可以减少像素和噪点。这对于那些需要在网上展示高质量图片的人来说尤其重要。裁剪后的图片可能更清晰、更锐利&#xff0c;并且更适合在各种设备上观…

Alex-Net 与 VGG-16

Alex-Net 由加拿大多伦多大学的 Alex Krizhevsky、Ilya Sutskever(G. E. Hinton 的两位博士生)和 Geoffrey E. Hinton 提出&#xff0c;网络名“Alex-Net”即 取自第一作者名。 下图所示是 Alex-Net 的网络结构&#xff0c;共含五层卷积层和三层全连接层。其中&#xff0c;Ale…

03.SELF-INSTRUCT+Alpaca

文章目录 前言泛读储备知识提示学习提示工程Promt Engineering答案工程 背景介绍研究SELF-INSTRUCT的动机研究意义&贡献 精读Overview种子任务步骤1&#xff1a;定义指令数据步骤2&#xff1a;自动指令数据生成步骤2.1指令生成步骤2.2指令分类步骤2.3实例生成步骤2.4筛选和…

19.组件之间传递数据

不同组件传递数据的时候&#xff0c;最好不要直接传递复杂数据类型(比如对象&#xff0c;数组) 前端需要处理的数据层级一般不会很多&#xff0c;需要在多处使用的数据一般会被放到数据库中 目录 1 组件的关系 2 父向子传递数据-props 3 子向父传递数据-自定义事件 4 …

分布式任务调度平台 XXL-JOB 实战

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Scrum敏捷估算

无论是团队研发一款产品或者开发某一个项目&#xff0c;我们都需要回答“我们大概什么时间能够完成&#xff1f;”&#xff0c; 或者到某一个时间点&#xff0c;我们能够做到什么程度&#xff0c; 因此和传统的开发模式一样&#xff0c;我们在工作开始之前需要对我们需要做的事…

Linux Vim基本操作(文件的打开和编辑)完全攻略(有图有真相)

首先学习如何使用 Vim 打开文件。 Vim 打开文件 使用 Vim 打开文件很简单&#xff0c;例如在命令行模式下打开一个自己编写的文件 /test/vi.test&#xff0c;打开方法如下&#xff1a; [rootitxdl ~]# vim /test/vi.test 刚打开文件时 Vim 处于命令模式&#xff0c;此时文件…

CTFshow-pwn入门-前置基础pwn26-pwn28

什么是ASLR 大多数的攻击都基于这样一个前提&#xff0c;即攻击者知道程序的内存布局&#xff0c;需要提前知道shellcode或者其他一些数据的位置。因此&#xff0c;引入内存布局的随机化能够有效增加漏洞利用的难度&#xff0c;其中一种技术就是ASLR&#xff08;Address Space…

无线wifi视频传输方案|基于qca9531方案SKW99的无线视频流云端推送方案

为满足物联网智慧校园&#xff0c;智能家居&#xff0c;智慧工厂&#xff0c;智能交通、智慧博物馆、培训机构等不同行业实时直播的需求。本篇以集成200万高清摄像头功能的高通方案qca9531 wifi模块SKW99为为例&#xff0c;简单介绍基于WiFi技术的无线视频流云端推送方案。 1、…

上位机与两台PLC之间无线PPI通信

在实际系统中&#xff0c;人机界面与PLC通常不在一起&#xff0c;中心计算机一般放置在控制室&#xff0c;而PLC安装在现场车间&#xff0c;二者之间距离往往从几十米到几千米。如果布线的话&#xff0c;需要挖沟施工&#xff0c;比较麻烦&#xff0c;这种情况下比较适合采用无…