29 November 2018
At GopherCon 2017, Russ Cox officially started the thought process on the next big version of Go with his talk The Future of Go (blog post). We have called this future language informally Go 2, even though we understand now that it will arrive in incremental steps rather than with a big bang and a single major release. Still, Go 2 is a useful moniker, if only to have a way to talk about that future language, so let’s keep using it for now.
A major difference between Go 1 and Go 2 is who is going to influence the design and how decisions are made. Go 1 was a small team effort with modest outside influence; Go 2 will be much more community-driven. After almost 10 years of exposure, we have learned a lot about the language and libraries that we didn’t know in the beginning, and that was only possible through feedback from the Go community.
In 2015 we introduced the proposal process to gather a specific kind of feedback: proposals for language and library changes. A committee composed of senior Go team members has been reviewing, categorizing, and deciding on incoming proposals on a regular basis. That has worked pretty well, but as part of that process we have ignored all proposals that are not backward-compatible, simply labeling them Go 2 instead. In 2017 we also stopped making any kind of incremental backward-compatible language changes, however small, in favor of a more comprehensive plan that takes the bigger picture of Go 2 into account.
It is now time to act on the Go 2 proposals, but to do this we first need a plan.
在2017年的GopherCon（Go语言年终总结大会）上，Russ Cox（拉斯•考克斯）正式地开始了他关于Go的下一个大版本的思考过程，并发表了《Go的未来》的演讲。我们非正式地把这个将来的语言叫做Go 2，虽然我们现在知道它将以渐进的脚步而不是以一个大爆炸和单一主要的版本来发布。然而，如果仅仅是有一个讨论这个未来的语言方式，Go 2是一个好用的别名，所以现在让我们就这么叫它吧。
Go 1和Go 2的一个主要的变化就是谁将影响设计和如何做出决策。Go 1是一个小团队的努力，外部影响不大； Go 2将会更多是社区驱动。经过了至少十年的曝光，我们学到了很多我们刚开始并不知道的关于语言和库的知识，而且，这也仅仅是通过社区的反馈才有可能的。
在2015年，我们介绍了提案流程来收集特定类型的反馈：语言和库的变更提案。一个由高级Go团队成员组成的委员会一直在定期审阅，分类和决定提交的提案。它工作的相当好，但是作为该过程的一部分，我们无视了所有向下兼容的提案，简单的标记了他们将在Go 2被实现。在2017年，我们也停止了进行任何类型的渐进式向下兼容的语言变更，无论多么小，都有利于打造一个更全面的将Go 2的大局考虑在内的计划。
At the time of writing, there are around 120 open issues labeled Go 2 proposal. Each of them proposes a significant library or language change, often one that does not satisfy the existing Go 1 compatibility guarantee. Ian Lance Taylor and I have been working through these proposals and categorized them (Go2Cleanup,NeedsDecision, etc.) to get an idea of what’s there and to make it easier to proceed with them. We also merged related proposals and closed the ones which seemed clearly out of the scope of Go, or were otherwise unactionable.
Ideas from the remaining proposals will likely influence Go 2’s libraries and languages. Two major themes have emerged early on: support for better error handling, and generics. Draft designs for these two areas have been published at this year’s GopherCon, and more exploration is needed.
But what about the rest? We are constrained by the fact that we now have millions of Go programmers and a large body of Go code, and we need to bring it all along, lest we risk a split ecosystem. That means we cannot make many changes, and the changes we are going to make need to be chosen carefully. To make progress, we are implementing a new proposal evaluation process for these significant potential changes.