Go 语言的下一个大版本:Go 2.0 被安排上了!

局长
 局长
发布于 2018年12月01日
收藏 26

今年 8 月 Go 开发团队公布了 Go 2.0 的设计草案,包括错误处理和泛型这两大主题。现在备受瞩目的 Go 2.0 又有了新动向 —— 昨日 Go 开发团队在其官方博客表示,Go 2 已经被安排上了!目前 Go 2 已进入确定变更提案的阶段,并公布了提案评估流程。

废话不多说,先来看看 Go 2.0 有哪些值得关注的内容:

1.最大程度保持对 1.x 的兼容,以避免分裂 Go 语言生态系统
2.采用增量升级的方式,而非单独发布重大更新版本
3.实施新的提案评估流程,以评估尚未解决且被标记为提案的 issue
4.将会在 Go 1.13 版本中选择 Go 2 部分的提案

背景

早在2017年的 GopherCon 大会上,Russ Cox(Go 核心开发团队的技术 leader)就已经正式开始思考 Go 的下一个大版本(相关文章)。当时官方非正式地将它称为 Go 2,但我们知道,所谓的 Go 2.0 并非一个单独的重大更新版本,而是通过“增量更新(incremental)”的方式以逐渐抵达 "Go 2.0"。所以本文对这个未来版本的称号 —— 也暂且用 Go 2 来描述。

Go 1 和 Go 2 之间的主要区别在于主导权的不同。谁将影响设计,又该如何做出决策?我们都知道,Go 1 的诞生是小团队努力的结果,受外部影响不大;而到了 Go 2,尤其是经过将近 10 年的发展后,Go 语言的生态已经十分庞大,因此它也更多地受到社区的驱动和影响。经历了这些,Go 开发团队也了解到了更多一开始不知道的与语言特性和库相关的知识 —— 这些都来自于 Go 社区的反馈。

2015年,Go 开发团队引入了提案流程,以收集特定类型的反馈:针对语言和库变更方面的提案。由 Go 开发团队高级成员组成的委员会定期审查、分类和决定社区提交的提案。这个流程十分有效,但作为该过程的一部分,他们忽略了所有不向后兼容的提案,只是将其标记至 Go 2。到了2017年,Go 开发团队也停止进行任何类型的向后兼容的“增量”语言特性变更,因为他们认为无论变更多么小,都要有更全面的支持计划,并将 Go 2 考虑在内。

对于这些累积下来的提案,官方表示现在是时候采取行动了!

近况

本文发布时,官方表示目前在 Go 2 的提案中,大约有 120 个尚未解决且被标记为提案的 issue。这些提案都涉及到重要的库或语言特性变更,而它们通常不能与 Go 1 互相兼容。Ian Lance Taylor 和 Robert Griesemer 一直在研究这些提案,并对它们进行了分类(Go2Cleanup, NeedsDecision 等),以理解这些提案背后的含义并使它们后续更易进行。此外,他们还合并了相似的提案,并关闭了那些看似明显超出 Go 范围的提案,或者其他方面无法实现的提案。

早期出现的两个提案包括更好的错误处理和泛型,而它们的草案已在今年的 GopherCon 大会上发布,等待更多的探索发展。至于剩余的提案,官方提到,他们不希望过度影响数百万 Go 开发者以及现在的 Go 代码,更不想冒着分裂生态系统的风险去改版 Go 2,因此 Go 2 无法做出太多变更,每一个变更都需要仔细选择。为此,这些提案都将使用新的提案评估流程来决定去留与发展。

提案评估流程

提案评估流程旨在收集对少数选定提案的反馈意见,以作出最终决定。这个过程或多或少会与发布周期并行进行,包括以下步骤:

  1. 提案选择:Go 开发团队选择少量看起来值得考虑接受的 Go 2 提案,但尚未做出最终决定。

  2. 提案反馈:Go 开发团队将发布一份列出所选提案的公告,公告会向社区解释提案的初衷并收集反馈意见。在这个步骤中,社区可提出建议。

  3. 实现:根据来自社区的反馈意见,提案开始实现。

  4. 针对所实现的提案的反馈:在开发周期中,Go 开发团队和社区试用新功能并且收集进一步的反馈意见。

  5. 启动决策:在三个月的开发周期结束时,根据在发布周期中收集的经验和反馈意见,Go 开发团队会考虑变更的预期收益或产生的额外成本,从而最终决定是否发布每个变更。一旦发布,这些被发布的提案就成为语言和库的一部分。未被发布的提案可能会重新起草,但也有可能会被永久拒绝。

可以看到,通过两轮的反馈过程,可对提案进行有效的筛选,从而防止“功能蔓延(feature creep)”,有助于保持 Go 语言的简洁。

提案选择标准

一项提案至少要满足以下这些条件:

  1. 解决大部分使用者觉得重要的问题

  2. 不会对其他使用者造成太大的影响

  3. 提供一个清晰且易于理解的解决方案

条件1确保提案所做的任何变更都可以帮助到尽可能多的 Go 开发者(使他们编写的代码更健壮、正确性更高等),条件2则保证了变更将给使用者带来的影响降到最低。

至于条件3,如果提案不能满足该条件,它将不会被实现。即便这项提案能够解决一个很重要的问题,思路也很好,但在没有实现方案的情况下,它将会被拒绝,并需要重新起草。

下一步

在这篇文章发布时,Go 开发团队表示已经执行提案评估流程的第一步,并开始了流程的第二步,关于具体的提案可点此进行查看

对于 Go 开发团队已经明确并通过的提案,将会继续实现(即评估流程的第3步)。开发团队表示希望在下一个发布周期的第一天(暂定于2019年2月1日)完成这些提案变更的实现,所以这次可能会在较早的时间开始进行,以留出两个月的反馈时间(2018年12月至2019年1月)。

而在为期3个月的开发周期中(2019年2月至5月),被选择的提案将会被实现,每位使用者都可以体验新功能并进行反馈(评估流程的第4步)。

最后,在短暂的冻结期后(2019年5月1日),Go 开发团队会最终决定是否永久保留新功能(并保证这些功能与 Go 1 兼容),或是放弃这些功能(评估流程的最后一步)。

Go 开发团队表示这是首次采用这一流程,因此在冻结阶段将会是反思这个流程,并在必要时进行调整的好机会。我们也不妨拭目以待吧!

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Go 语言的下一个大版本:Go 2.0 被安排上了!
加载中

精彩评论

橙汁儿
橙汁儿
泛型加上就行了,其他的不是重要的
bkkkd
bkkkd
好事,不过这么多都是用开源库。如果不兼容的话,这么多开源库就凉凉了
昵称非法已被屏蔽

引用来自“angelboy”的评论

现在错误处理多好啊,说不好的估计就是懒得一个一个去处理用try吧,每个错误单独抛出不同的错误不好么,用try的时候想每个单独处理错误还要多次try才恶心
不管效果如何, 但是go的写法很丑陋,你觉得呢?
无聊的人啊
无聊的人啊
哈哈哈哈,狗儿们注意是尽量兼容
LongRaindy
LongRaindy
祝Goer越来越好,坚持go路线不改变。

最新评论(31

颜文
颜文
修改异常方案
范型
拉姆达表达式
久永
久永
在让整个开源社区吃了十年螃蟹之后,终于他们准备自己开始吃了。
lemonwater
lemonwater
很期待go2,不过等到正式版发布可能要到19年年中了吧
xiaoaiwhc1
xiaoaiwhc1

引用来自“zb1488614096720”的评论

Rust/Go双喜临门,就看谁发展得好了
Rust 没有 killer app, 暂时还追不上
Aruforce
Aruforce
泛型,错误处理要求更改语法。。现在的代码全是defer。。recover。。,线程本地存储,包管理尤其是版本。。。还有线程池。。。
d
dwingo

引用来自“开源中国首席罗纳尔多”的评论

请问现在这个情况,现在的版本是对应JAVA时代哪个版本?1.2?我在估算什么时候可以用用。。
Java诞生9年后的Java5才支持泛型, Go明年的2.0开始支持泛型,也接近10年了.
昵称非法已被屏蔽

引用来自“angelboy”的评论

现在错误处理多好啊,说不好的估计就是懒得一个一个去处理用try吧,每个错误单独抛出不同的错误不好么,用try的时候想每个单独处理错误还要多次try才恶心
不管效果如何, 但是go的写法很丑陋,你觉得呢?
k
keep_wan

引用来自“蒙古海军总司令”的评论

请问go擅长做什么
网络方面.
蒙古海军总司令
请问go擅长做什么
开源中国首席罗纳尔多
开源中国首席罗纳尔多
请问现在这个情况,现在的版本是对应JAVA时代哪个版本?1.2?我在估算什么时候可以用用。。
返回顶部
顶部