:::info
日期:2020 年 06 月 16 日
作者:Ian Lance Taylor and Robert Griesemer
原文链接:https://go.dev/blog/generics-next-step
:::
介绍
距离我们上次写关于向 Go 添加泛型的可能性的文章已经快一年了。 是时候更新了
更新设计
我们一直在继续完善泛型设计草案。 我们为它编写了一个类型检查器:一个程序可以解析使用设计草案中描述的泛型的 Go 代码并报告任何类型错误。 我们已经编写了示例代码。 我们已经收集了很多人的反馈——感谢提供!
根据我们所了解的,我们将发布更新的设计草案。 最大的变化是我们正在放弃合同的想法。 契约和接口类型之间的区别令人困惑,所以我们消除了这种区别。 类型参数现在受接口类型的约束。 现在允许接口类型包含类型列表,但仅在用作约束时; 在之前的设计草案中,类型列表是合同的一个特征。 更复杂的情况将使用参数化接口类型。
我们希望人们会发现这个设计稿更简单、更容易理解。
实验工具
为了帮助决定如何进一步完善设计草案,我们发布了一个翻译工具。 这是一个工具,允许人们键入检查并运行使用设计草案中描述的泛型版本编写的代码。 它的工作原理是将通用代码转换为普通的 Go 代码。 这个翻译过程带来了一些限制,但我们希望它足以让人们了解通用 Go 代码的样子。 泛型的真正实现,如果它们被语言接受,将会以不同的方式工作。 (我们才刚刚开始勾勒出直接编译器实现的样子。)
该工具可在 https://go2goplay.golang.org 上的 Go 游乐场变体上使用。 这个 Playground 就像通常的 Go playground,但它支持通用代码。
您也可以自己构建和使用该工具。 它在 Go 主仓库的一个分支中可用。 按照从源代码安装 Go 的说明进行操作。 在这些说明指导您查看最新发布标签的地方,请运行 git checkout dev.go2go。 然后按照指示构建 Go 工具链。
翻译工具记录在 README.go2go 中。
下一步
我们希望该工具能让 Go 社区有机会试验泛型。 我们希望学习的主要有两件事。
首先,通用代码有意义吗? 感觉像Go吗? 人们会遇到什么惊喜? 错误信息有用吗?
其次,我们知道很多人说 Go 需要泛型,但我们不一定确切知道这意味着什么。 这个设计草案是否以有用的方式解决了这个问题? 如果有一个问题让你觉得“如果 Go 有泛型我可以解决这个问题”,你能在使用这个工具时解决这个问题吗?
我们将使用从 Go 社区收集的反馈来决定如何向前发展。 如果设计草案受到好评并且不需要进行重大更改,下一步将是正式的语言更改提案。 为了设定预期,如果每个人都对设计草案完全满意并且不需要任何进一步的调整,那么最早可以将泛型添加到 Go 中的将是 Go 1.17 版本,计划于 2021 年 8 月发布。 可能是不可预见的问题,所以这是一个乐观的时间表; 我们无法做出任何明确的预测。
反馈
为语言更改提供反馈的最佳方式是在邮件列表 golang-nuts@googlegroups.com 上。 邮件列表并不完美,但它们似乎是我们最初讨论的最佳选择。 在撰写设计草案时,请将 [generics] 放在主题行的开头,并针对不同的特定主题启动不同的线程。
如果您在泛型类型检查器或翻译工具中发现错误,则应将它们提交到 https://golang.org/issue 上的标准 Go 问题跟踪器中。 请以 cmd/go2go: 开始问题标题。 请注意,问题跟踪器不是讨论语言更改的最佳场所,因为它不提供线程,并且不太适合冗长的对话。
我们期待您的反馈。
鸣谢
我们还没有完成,但我们已经走了很长一段路。 如果没有很多帮助,我们就不会在这里。
我们要感谢 Philip Wadler 和他的合作者正式思考 Go 中的泛型并帮助我们阐明设计的理论方面。 他们的论文 Featherweight Go 分析了 Go 受限版本中的泛型,并且他们在 GitHub 上开发了一个原型。
我们还要感谢为早期版本的设计草案提供详细反馈的人。
最后但同样重要的是,我们要感谢 Go 团队中的许多人、Go 问题跟踪器的许多贡献者,以及所有分享早期设计草案想法和反馈的人。 我们阅读了所有内容,我们很感激。 没有你,我们就不会在这里。