Go 泛型(Generics)的设计草图发布

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

Ian Lance Taylor 和 Robert Griesemer
2020年6月16日

简介

我们已经快一年没见 上一篇关于添加泛型的可能性的文章了。 是时候更新了。

设计上的更新

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

根据我们所学到的,我们发布了一个 更新的设计草案。最大的变化是我们正在放弃 contracts 的想法。契约(contracts)和接口(interface)类型之间的差异是令人困惑的,所以我们需要消除这种差异。类型参数现在受接口类型的约束。接口类型现在允许包括类型列表( type lists),尽管仅当用作约束时。在以前的设计草案中,类型列表是契约的一个特征。更复杂的情况将使用参数化接口类型。

我们希望人们会发现此设计草案更简单、更易于理解。

实验工具

为了帮助决定如何进一步细化设计草案,我们正在发布翻译工具。这是一个允许人们键入、检查和运行使用设计草案中描述的泛型版本编写的代码的工具。它的工作方式是将泛型代码转换为普通的 Go 代码。这个翻译过程施加了一些限制,但我们希望它足以让人们体验泛型代码。泛型的真正实现,如果在语言中被接受,将会有不同的工作方式。(我们才刚刚开始勾勒出直接编译器实现的样子。)

该工具可在 Go playground 的变种上获得 https://go2goplay.golang.org 。 他们和官方的 playground 类似,但它支持泛型代码。

您也可以自己生成和使用该工具。它在 Go 仓库的一个分支中。请按照 安装Go from source的说明 。在检出 release tags 部分,替换为 git checkout dev.go2go,接下来正常操作即可。

解析工具的文档请查看 README.go2go

下一步

我们希望该工具将给 Go 社区一个实验泛型的机会。我们希望学习两件主要的事情。

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

第二,我们知道很多人说 Go 需要泛型,但我们不一定确切知道这意味着什么。这个设计草案是否以一种有用的方式解决了这个问题?如果有一个问题让你认为 『如果Go有泛型,我可以解决这个问题』,你在使用此工具时解决这个问题了吗?

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

反馈

为语言更改提供反馈的最好方法是给邮件列表 golang-nuts@googlegroups.com 发邮件。邮件列表并不完美,但它们似乎是我们最初讨论的最佳选择。在撰写设计草案时,请在主题行的开头加上[Generics],并针对不同的特定主题启动不同的线程。

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

我们期待您的反馈。

感谢

我们还没有完成,但我们已经走过了很长的路。我们得能到今天的进展,离不开很多帮助。

我们要感谢 Philip Wadler 及其合作者在 Go 中正式思考泛型,并帮助我们澄清设计的理论方面。他们的论文 Featherweight Go 分析了受限版本 Go 中的泛型,他们已经开发了一个原型 在GitHub上

我们还要感谢 Go 团队中的许多人,Go 问题追踪者的许多贡献者,以及其他所有在泛型早期设计草案上分享想法和反馈的人。我们都读过了,我们很感激。没有你我们不会在这里。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/design-...

译文地址:https://learnku.com/docs/go-blog/design-...

上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~