Go 未来方向:标准库 v2 改进的指导原则

大家好,我是煎鱼。

在五一假期的第一天,Go 核心团队也没有闲着,@Russ Cox 直接在官方博客发布了《Evolving the Go Standard Library with math/rand/v2》这篇文章。

a084e6bdee5966f5dbce5c9f8075c5af.png

其部分内容是对本次做 math/rand/v2 标准库升级的内容进行再度陈述,有兴趣的小伙伴可以阅读我之前写的《Go1.22 新特性:新的 math/rand/v2 库,更快更标准!》,能够知悉全貌。

本文的重点是对另外的 Go 标准库 v2 的指导思想和规划进行分享。

之前:标准库 v1 问题

自 Go1 在 2012 年 3 月发布以来,对标准库的修改一直受到 Go1 的兼容性承诺的约束。

aa95ea270f5bd33e987e6db8c065c9cd.png

总体而言,Go1 兼容性保障对 Go 用户来说是一个福音,它为生产系统、文档、教程、书籍等提供了一个稳定的基石。

然而随着时间的推移,Go 核心团队意识和发现原始 API 中,存在着许多错误无法以兼容的方式修复。

包括在其他场景下,Go 的最佳实践和约定已经发生了变化。我们需要一个可推进的计划来做出重要的、破坏性的变更。

为此,Go 1.22 新增的 math/rand/v2 包,这是标准库中的第一个 “v2” 包。它为 math/rand API 带来了必要的改进。

更重要的是:它为我们如何根据需要修订其他标准库包树立了榜样。

未来:标准库 v2 演进原则

基本准则

这项工作的目标之一是:为标准库中所有 v2 包的处理方式建立原则和模式。

在接下来的几个 Go 版本中,Go 核心团队承诺不会有大量的 v2 包涌现。相反,他们将每一次只处理一个包,提高设计质量。

确保新的标准库 v2 设定的质量标准能够持续十年。(可能有许多包根本不需要 v2)

三个设计原则

对于那些确实需要 v2 版本的包,我们将会归结为三个设计原则去实施。

具体如下:

1、不兼容的新版本软件包将使用 /package/v2 作为导入路径:就像标准库之外的 v2 模块一样遵循语义导入版本化。这样原始软件包 v1 和 v2 软件包就可以在一个程序中共存,这对于逐步转换到新的应用程序接口至关重要。

2、所有更改都必须以尊重现有用法和用户为基础:我们绝不能引入不必要的变化,无论是对现有软件包的不必要更改,还是必须学习的全新软件包。在实践中,这意味着我们要以现有软件包为起点,只对动机明确、价值合理的软件包进行修改。

3、v2 标准库不能把 v1 用户抛在后面,完全不管了。在理想情况下,v2 软件包应能做 v1 软件包能做的一切事情,而当 v2 发布时,v1 软件包应被重写为 v2 的薄封装。这将确保现有的 v1 软件包继续受益于 v2 中的错误修复和性能优化,也保证了 v1 的兼容性。

意外考量

相较于 v1, v2 的包将会引入破坏性的变化,想让 v1 被重写为 v2 的薄封装,并不总是可行的,在设计上这始终是需要慎重考虑的。

像是本次新增的 math/rand/v2,我们将 rand 中 auto-seeded v1 函数调用 v2 生成器,但由于重复性违规,我们无法共享其他代码。最终,math/rand 改动的代码量并不大,也不需要定期维护,因此重复是可控的。

在其他情况下,为避免重复做更多的工作可能是值得的。例如:在 encoding/json/v2 的设计(仍在进行)中,虽然默认语义和 API 都发生了变化,但软件包提供的配置项可以实现 v1 API。

当我们最终发布 encoding/json/v2 时,encoding/json (v1) 将成为它的一个薄包装,确保不从 v1 迁移的用户仍能受益于 v2 中的优化和安全修复。

总结

通过阅读本文的标准库 v2 的设计讲解,能够感受到其实 @Russ Cox 已经对 Go 兼容性这块做好了规划。基本是先动 Go1 兼容性前后保障的准则,再动标准库。同时标准库 v2 要兼容 v1 的使用,不能直接就是完全不维护了。

这样对于用户的得益虽然是较大的,但对于 Go 核心团队来讲,维护的工作量和可能出现的程序意外(BUG)的概率也会变大,因为要兼容的新老场景都变多了。

不论怎么说,未来这将会出现。大家可以一起见证 Go 标准库 v2 接下来的发展!我猜 json v2 包要快转正了。

推荐阅读

关注和加煎鱼微信,

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

967cc3e52e5e5074a971760858fc482b.jpeg

634431ea602e0b4323c02d2e98bbc996.png

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

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

原创不易 点赞支持

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值