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 版本中添加泛型。我们欢迎实质性的批评和评论,但请尽量避免重复先前的评论,并请尽量 避免简单的“加一”和“减一”式评论。而是对您同意或不同意的评论,或对整个提案,添加 👍/👎 表情符号反应。

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

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

下一篇文章:Go 中的命令 PATH 安全性
上一篇文章:Go 在 ARM 及其他平台上的应用
博客索引