首页 文章详情

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

Go语言精选 | 284 2021-02-17 10:26 0 0 0
UniSMS (合一短信)


作者: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



推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter