Go1.14 都还没发布,官方已经准备 Go 1.15 了:它有哪些新东西?


Go1.14 都还没发布,官方已经准备 Go 1.15 了:它有哪些新东西?

状态

已经临近 Go1.14 发布了,计划在 2 月份发布,RC1 候选版本已经准备好了。根据 Go 2, here we come![1] 这篇文章描述的过程,这到了我们开发和发布周期考虑的时候,我们是否希望在下一个版本中(Go1.15)增加语言和库的更改,并计划于今年 8 月份发布。

Go 的主要目标仍然是程序包和版本管理,更好的错误处理支持以及泛型。模块支持状况良好,并且每天都在不断完善,我们在泛型方面也正在取得进展(今年晚些时候会取得更多进展)。我们七个月前试图提供更好的错误处理机制的尝试 try proposal[2] 得到了良好的支持,但也遭到了强烈反对,因此我们决定放弃它。在此之后,提出了许多后续建议,但它们似乎都没有足够的说服力,明显优于 try 建议,或者不太可能引起类似的争议。因此,我们暂时没有进一步追求错误处理的变化。也许将来的一些见识将有助于我们改善现状。

提案

鉴于模块和泛型正在积极开发中,并且由于错误处理暂时无法进行更改,我们还应该进行其他哪些更改(如果有)?有一些常年性的收藏夹,例如对枚举和不可变类型的需求,但是这些思想还没有得到充分发展,它们也没有足够紧急以引起 Go 团队的关注,尤其是在考虑到语言改变的成本时。

在审查了所有可能可行的提案之后,更重要的是,由于我们不想在没有长期计划的情况下逐步增加新功能,因此得出结论,这次最好不进行重大更改。取而代之的是,我们专注于几个新的 “vet” 检查以及对语言的较小调整。我们选择了以下 3 个建议:

#32479[3] Diagnose string(int) conversion in go vet

我们计划在即将发布的 Go 1.14 版本中做到这一点,然而我们并没有解决这个问题,因此再次出现。为方便起见,string(int)转换是在 Go 的早期引入的,但是它使新手感到困惑(string(10)是\\n而不是10),现在已经不合理了。转换可以在 unicode/utf8包中进行。由于删除此转换[4]不是向后兼容的更改,因此我们建议改从 vet 错误开始。

#4483[5] Diagnose impossible interface-interface type assertions in go vet

当前,Go 允许接口类型的 x 和 T 进行类型断言 x.(T)(以及相应的 type swtich case)。但是,如果 x 和 T 具有相同名称但签名不同的方法,则分配给 x 的任何值也不能实现 T。这样的类型断言将始终在运行时失败( panic 或返回 false)。由于我们在编译时就知道这一点,因此编译器也可能会报告错误。在这种情况下,报告编译器错误不是向后兼容的更改,因此,我们还建议从 vet 错误开始。

#28591[6] Constant-evaluate index and slice expressions with constant strings and indices

当前,用一个或多个常量索引对一个常量字符串进行索引或切片会分别产生一个非恒定的 字节或字符串值。但是,如果所有操作数都是常量,则编译器可以对这些表达式进行常量求值,并产生常量(可能是无类型的)结果。这是完全向后兼容的更改,我们建议对规范和编译器进行必要的调整。

时间规划

我们认为,这三个提案中没有一个会引起争议,但是我们总是有可能错过一些重要的东西。因此,我们计划在 Go 1.15 发行周期的开始(在Go 1.14发行时或之后)实施提案,以便有足够的时间收集经验并提供反馈。根据提案评估流程[7],最终决定将在2020 年 5 月初的开发周期结束时做出。

还有一件事情。。。

我们收到了更多的语言更改建议(标记为 LanguageChange 的 issue[8]),我们无法对其进行彻底审查。例如,仅就错误处理而言,就有 57 个 issue,其中五个 issue 目前仍未解决。由于进行语言更改的成本,无论大小如何,都很高,而且收益往往不清楚,因此我们必须谨慎行事。因此,大多数语言更改建议迟早都会遭到拒绝,有时反馈很少。这可能对相关人来说不满意。如果你花费大量时间和精力详细概述了你的想法,立即拒接它肯定是不好的。在另一方面,由于一般的

提案流程[9]刻意保持简单,因此创建仅很少量的语言更改提案非常容易进行,这导致审查委员会进行了大量工作。为了改善每个人的体验,我们添加了一个新的 questionnaire[10]:填写该模板将有助于审阅者对提案进行更有效的评估,因为他们不需要自己尝试回答这些问题。希望它能从一开始就设定期望,从而为提议者提供更好的指导。这是一个实验,我们会根据需要随着时间的推移进行完善。

谢谢您帮助改善 Go 的体验!

Robert Griesemer, for the Go team

28 January 2020

https://blog.golang.org/go1.15-proposals

[1]

Go 2, here we come!: https://blog.golang.org/go2-here-we-come

[2]

try proposal: https://golang.org/issue/32437

[3]

#32479: https://github.com/golang/go/issues/32479

[4]

删除此转换: https://github.com/golang/go/issues/3939

[5]

#4483: https://github.com/golang/go/issues/4483

[6]

#28591: https://github.com/golang/go/issues/28591

[7]

提案评估流程: https://blog.golang.org/go2-here-we-come

[8]

标记为 LanguageChange 的 issue: https://github.com/golang/go/labels/LanguageChange

[9]

提案流程: https://github.com/golang/proposal/blob/master/README.md

[10]

questionnaire: https://github.com/golang/proposal/blob/master/go2-language-changes.md


分享到:


相關文章: