泛型的下一步

2020-06-17 03:46:51

自从我们上一次写到向Go添加泛型的可能性已经将近一年了,是时候进行更新了。

我们一直在继续改进泛型设计草案。我们已经为它编写了一个类型检查器:一个可以解析Go代码的程序,它使用设计草案中描述的泛型并报告任何类型错误。我们已经编写了示例代码。我们已经从很多人那里收集了反馈-感谢您提供它!

根据我们所了解到的,我们正在发布更新的设计草案。最大的变化是我们放弃了合同的概念。合同和接口类型之间的差异令人困惑,因此我们正在消除这种差异。类型参数现在由接口类型约束。接口类型现在被允许包括类型列表,但仅当用作约束时;在以前的设计草案中,类型列表是合同的一个功能。更复杂的情况将使用参数化的接口类型。

为了帮助决定如何进一步改进设计草案,我们正在发布一个翻译工具。这是一个允许人们使用设计草案中描述的泛型版本键入、检查和运行代码编写的工具。它的工作方式是将泛型代码转换为普通围棋代码。这个翻译过程施加了一些限制,但我们希望它足够好,让人们能够感觉到泛型围棋代码是什么样子。如果泛型被接受为语言,那么它们的真正实现将以不同的方式工作。(我们才刚刚开始。

该工具在https://go2goplay.golang.org.This游乐场的围棋操场的变体上可用,就像通常的围棋操场一样,但它支持通用代码。

您也可以自己构建和使用该工具。该工具可在GO主报告的分支中找到。请按照从源代码安装GO的说明进行操作。其中这些说明会指导您签出最新版本的标签,而不是运行git checkout dev.go2go。然后按照说明构建Go工具链。

我们希望这个工具能给围棋社区一个尝试泛型的机会。

首先,泛型代码有意义吗?感觉像Go吗?人们会遇到什么惊喜?错误消息有用吗?

第二,我们知道很多人都说围棋需要泛型,但我们不一定确切知道这是什么意思,这个设计草案解决了这个问题吗?如果有一个问题让你认为“如果Gohad泛型我可以解决这个问题”,你能在使用这个工具的时候解决这个问题吗?

我们将根据从围棋社区收集的反馈来决定如何向前推进。如果设计草案很受欢迎,不需要重大修改,下一步将是正式的语言修改建议。为了设定预期,如果每个人都对设计草案完全满意,并且不需要任何进一步的调整,那么最早可以添加泛型的围棋版本将是计划于2021年8月发布的围棋1.17版本。当然,在现实中,可能会有无法预见的问题,所以这是一个反乐观的时间表;我们不能确定任何。

为语言更改提供反馈的最佳方式是在邮件列表[email protected]上。邮件列表并不完美,但它们似乎是我们最初讨论的最佳选择。在撰写设计草稿时,请将[Generics]放在主题行的开头,并针对不同的特定主题启动不同的主题。

如果您在泛型类型检查器或翻译工具中发现错误,则应将它们归档到标准的GO问题跟踪器中,地址为:https://golang.org/issue.Please以cmd/go2go:开始问题标题。请注意,问题跟踪器不是讨论语言更改的最佳位置,因为它不提供线程,也不适合冗长的对话。

我们还没有完成,但我们已经走了很长一段路。如果没有很多帮助,我们不会在这里。

我们要感谢菲利普·瓦德勒(Philip Wadler)和他的合作者对围棋中的泛型进行了正式的思考,并帮助我们澄清了设计的理论方面。他们的论文Featherweight Go分析了围棋受限版本中的泛型,他们在GitHub上开发了一个原型。

我们也要感谢对设计草案的早期版本提供详细反馈的人员。

最后但绝对不是最不重要的一点是,我们要感谢Go团队的许多人,Go问题跟踪器的许多贡献者,以及分享早期设计草稿的想法和反馈的每一个人。我们读了所有的东西,我们非常感激。没有你我们就不会在这里。