Go 泛型变更:约束太丑了,先移动到 x/exp 做实验性功能

Go语言泛型标准库中的constraints包引发了命名争议,有人提议改名为"of",但因未能达成共识而被拒绝。目前,Go团队决定将constraints包移至x/exp作为实验性功能,将在Go1.19或1.20重新评估其必要性。这一变动反映了泛型配套设施的混乱状态,建议开发者在生产环境中谨慎使用。
摘要由CSDN通过智能技术生成

大家好,我是煎鱼。

Go 泛型配套了各种标准库,像是常见的 maps、slices 泛型库。

早期他们是长这样的:

package maps

func Keys[M constraints.Map[K, V], K comparable, V any](m M) []K

func Values[M constraints.Map[K, V], K comparable, V any](m M) []V
...

又或是:

package slices

func Compare[E constraints.Ordered](s1, s2 []E) int 
...

关注到里面的标准库 constraints,他就是今天变更的主角。他咋了呢?

背景

标准库 constraints 是个新鲜事物,由泛型扛把子 Ian Lance Taylor 在 2021 年 9 月 24 日提交《constraints: new package to define standard type parameter constraints》 所添加。

如下图:

f5239476f5f2e10b68ba41513545bb96.png

主要作用是添加一个约束(constraints)包来定义一些标准有用的约束,所以我们会在通用库看到这些标准约束的使用。

缘由

新提案

在社区一番热烈讨论中,有人提了一个提案《proposal: constraints: rename package to "of"》,希望对 constraints 包进行更名。

78db6a31d5f50e471be08f8e11bf6e16.png

新的代码如下:

func Abs[V of.Number](v V) V{...}

func Sum[K comparable, V of.Number](m map[K]V) V {...}

作者认为使用 “of” 这个关键字比 “constraints” 更简单流畅。

该提案引来了大量的讨论,觉得 constraints 这个名字现在太长,一旦函数签名比较多,就会很繁琐,看着也不舒服。

有建议使用引用别名来解决的:

import of “constraints”

也有说是用 any,is 名字,甚至叫 std,或是其他的导入方式。

众说纷纭,虽然在后面大幅度的优化了 constraints 的使用频率,但一旦用到 2~3 次,就会出现函数签名过于庞大的问题。

最终由于未能讨论出明确的共识,被拒绝。

挣扎的结论

经过这长时间的泛型推进和命名争议,Russ Cox 发现约束包仍然存在着许多问题,是待商榷的。

63c3c13f6b314359fbac409e09c7673b.png

分别是:

  • 包名字太丑:很多人对包的名字,也就是对 constraints 很满意,也有很不满意的,觉得太长,太啰嗦。

  • 不知道放什么:对于放在包里面的东西,尚不清楚哪些接口是重要的,应该存在,哪些不应该存在。

  • 似乎不需要:一开始认为标准的约束是使用泛型的基础,但在实践中并没有证明是这样,甚至可以不要。

基于上述原因,Go 团队决定将标准库 constraints 与 maps、slices 一样,转移到 x/exp 中,作为实验性功能来对待。

再在 Go 1.19 或 1.20 中重新审视他们,看看是不是真的有用,又或是怎么用才是对的,再做决定。

总结

Go 泛型在本月(2月)即将在 Go1.18 中发布(春节的时候,通知社区鸽到 3 月份了...),虽然从表面来看,核心功能已经基本定型了,但配套设施还是比较乱。

建议大家在正式生产使用上,还是有注意节奏,免得踩坑。

你觉得 constraints 这个命名咋样,欢迎大家一起来讨论:)

参考

  • proposal: constraints: move to x/exp for Go 1.18

  • proposal: constraints: rename package to "of"

关注煎鱼,获取业内第一手消息和知识 👇

d049c04b50a4d300539e0e5b80358d16.png

e6c79d1038371428a54511c2728f165f.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值