Go官博:正式提案将泛型加入Go[译]

作者:Ian Lance Taylor[1]

泛型提案

我们已经提交了一份Go语言变更提案[2],以增加对类型和函数的类型参数的支持,支持一种泛型编程的范式。

为什么要加入泛型?

泛型可以给我们提供一种强大的构件(building block),让我们更容易地共享代码和构建程序。泛型编程是指编写函数和数据结构时,其中的一些类型留待以后指定。例如,你可以编写一个对任意数据类型的切片进行操作的函数,而实际的数据类型只有在函数被调用时才会被指定。或者,您可以定义一个存储任意类型值的数据结构,其中实际要存储的类型是在您创建数据结构实例时指定的。

自Go语言于2009年首次发布以来,对泛型的支持一直是被要求最多要支持的语言特性之一。您可以在之前的一篇博文[3]中阅读更多有关为什么泛型是有用的信息。

虽然泛型有明确的用途,但将它干净利落地融入Go这样的语言中是一项艰巨的任务。早在2010年,就有人尝试在Go语言中添加泛型[4]。在过去的十年里,还有其他一些尝试。

在过去的几年里,我们一直在进行一系列的设计草案,最终形成了一个基于类型参数的设计[5]。这个设计草案从Go编程社区得到了很多的反馈意见,并且很多人使用了之前一篇博文[6]中提到的generics playground[7]进行了真实体验。Ian Lance Taylor在2019年的GopherCon上做了一个演讲[8],讲述了为什么要添加泛型,以及我们现在采取的策略。Robert Griesemer在GopherCon 2020上做了后续演讲[9],介绍了泛型设计以及实现方面的变化。语言的变化是完全向后兼容的,所以现有的Go程序可以像今天一样继续工作。我们已经达到了这样的程度,所以我们认为设计草案已经足够好,也足够简单了,我们可以建议将其添加到Go中了。

现在发生了什么?

语言变更提案过程[10]是我们对Go语言进行变更的方式。我们现在已经开启了这个过程[11],以便在未来的Go版本中添加泛型。我们邀请大家提出实质性的批评和评论,但请尽量避免重复之前的评论,也请尽量避免简单的+1和-1样式的评论[12]。相反,请对您同意或不同意的评论,或对整个提案添加大拇指向上/大拇指向下的表情符号。

与所有的语言修改提案一样,我们的目标是推动达成共识,要么在语言中添加泛型,要么放弃该提案。我们明白,对于如此大规模的改变,不可能让Go社区的所有人都满意,但我们打算达成一个大家都愿意接受的决定。

如果这个提议被接受,我们的目标是在年底前完成一个完整的,尽管可能还没有完全优化的实现,供人们试用,也许可以作为Go 1.18测试版的一部分。

参考资料

[1] Ian Lance Taylor: https://github.com/ianlancetaylor

[2]  Go语言变更提案:  https://golang.org/issue/43651
[3]  一篇博文:  https://blog.golang.org/why-generics
[4]  有人尝试在Go语言中添加泛型:  https://golang.org/design/15292/2010-06-type-functions
[5]  一个基于类型参数的设计:  https://golang.org/design/go2draft-type-parameters
[6]  之前一篇博文:  https://blog.golang.org/generics-next-step
[7]  generics playground:  https://go2goplay.golang.org/
[8]  做了一个演讲:  https://www.youtube.com/watch?v=WzgLqE-3IhY
[9]  做了后续演讲:  https://www.youtube.com/watch?v=TborQFPY2IM
[10]  语言变更提案过程:  https://golang.org/s/proposal
[11]  开启了这个过程:  https://golang.org/issue/43651
[12]  尽量避免简单的+1和-1样式的评论:  https://golang.org/wiki/NoPlusOne
 

 

猜你喜欢

转载自blog.csdn.net/bigwhite20xx/article/details/112645882