Go 博客

Go 语言中添加泛型的提案

Ian Lance Taylor
2021 年 1 月 12 日

泛型提案

我们已提交了一份 Go 语言变更提案,旨在为类型和函数添加类型参数支持,从而允许一种形式的泛型编程。

为什么选择泛型?

泛型可以为我们提供强大的构建块,使我们更容易共享代码和构建程序。泛型编程意味着编写函数和数据结构,其中某些类型留待以后指定。例如,您可以编写一个对任意数据类型切片进行操作的函数,其中实际数据类型仅在调用该函数时指定。或者,您可以定义一个存储任何类型值的数据结构,其中要存储的实际类型在创建数据结构实例时指定。

自 Go 于 2009 年首次发布以来,对泛型的支持一直是请求最多的语言特性之一。您可以在一篇早期的博客文章中阅读更多关于泛型为何有用的内容。

尽管泛型有明确的使用案例,但将其干净地融入像 Go 这样的语言是一项困难的任务。首次(有缺陷的)尝试将泛型添加到 Go 可以追溯到 2010 年。在过去十年中还有其他几次尝试。

在过去的几年里,我们一直在研究一系列设计草案,最终形成了基于类型参数的设计。这份设计草案得到了 Go 编程社区的许多反馈,许多人使用泛型在线演练场进行了实验,该演练场在一篇早期的博客文章中有所描述。Ian Lance Taylor 在 GopherCon 2019 上发表了演讲,讨论了为什么要添加泛型以及我们现在遵循的策略。Robert Griesemer 在 GopherCon 2020 上发表了后续演讲,讨论了设计和实现的变更。语言变更完全向后兼容,因此现有的 Go 程序将继续按原样工作。我们认为设计草案已经足够好、足够简单,可以提议将其添加到 Go 中了。

接下来会发生什么?

语言变更提案流程是我们对 Go 语言进行变更的方式。我们现在已经启动了这一流程,以将泛型添加到 Go 的未来版本中。我们欢迎实质性的批评和评论,但请尽量避免重复之前的评论,并请尽量避免简单的“+1”和“-1”评论。相反,请对您同意或不同意的评论,或对整个提案,添加点赞/点踩表情符号反应。

与所有语言变更提案一样,我们的目标是推动达成共识,要么将泛型添加到语言中,要么放弃该提案。我们理解,对于如此重大的变更,不可能让 Go 社区中的每个人都满意,但我们打算达成一个大家都能接受的决定。

如果提案获得通过,我们的目标是在年底前提供一个完整(尽管可能尚未完全优化)的实现供大家尝试,也许作为 Go 1.18 测试版的一部分。

下一篇文章:Go 中的命令 PATH 安全性
上一篇文章:Go on ARM 及更广阔领域
博客索引