:::info 日期:2021 年 01 月 12 日
作者:Ian Lance Taylor
原文链接:https://go.dev/blog/generics-proposal :::

泛型提案

我们已经提交了 Go 语言更改提案,以添加对类型和函数的类型参数的支持,从而允许一种形式的泛型编程。

为什么需要泛型?

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

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

尽管泛型有明确的用例,但将它们完全融入 Go 这样的语言是一项艰巨的任务。 将泛型添加到 Go 的第一次(有缺陷的)尝试可以追溯到 2010 年。

在过去的十年中还有其他几次尝试。 在过去的几年里,我们一直致力于一系列设计草案,最终形成了基于类型参数的设计。 这个设计草案已经得到了 Go 编程社区的大量意见,许多人已经使用之前博客文章中描述的泛型游乐场对其进行了试验。 Ian Lance Taylor 在 GopherCon 2019 上发表了关于为什么要添加泛型以及我们现在遵循的策略的演讲Robert Griesemer 在 GopherCon 2020 上就设计和实现的变化进行了后续讨论。语言变化完全向后兼容,因此现有的 Go 程序将继续像今天一样工作。 我们已经到了我们认为设计草案足够好、足够简单的地步,建议将其添加到 Go 中。

现在发生了什么?

语言更改提案流程是我们对 Go 语言进行更改的方式。 我们现在已经开始这个过程,为 Go 的未来版本添加泛型。 我们欢迎实质性的批评和评论,但请尽量避免重复之前的评论,请尽量避免简单的加一减一评论。 相反,在您同意或不同意的评论或整个提案中添加大拇指/大拇指向下表情符号反应。

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

如果该提案被接受,我们的目标将是在年底之前为人们提供一个完整的,尽管可能没有完全优化的实现,作为 Go 1.18 测试版的一部分。