1.3 Go1.10过渡到Go2

回顾前一节中Go1到Go1.10的语法变化可发现,在Go1之后除了Go1.2的切片语法完善和Go1.9的类型别名很少有重量级的语法特性加入。这是因为Go1.2之后Go语言的语言设计基本是被冻结了,涉及到语言变化的Issue原则上必须通过Russ Cox等核心成员的同意才会被考虑。但是从Go1.10开始,官方终于开始启动Go2.0的语言前期设计工作。首先是官方开始提交模块化的草案,其次是很多呼声较高的语法糖特性开始被考虑逐步加入。可以说Go1.10之后进入了后Go1.0时代,它要在Go2.0到来之前解逐步完善细节问题,从而最终能给轻装上阵开始进入Go2.0开发流程。

1.3.1 Go1.11(2018年8月)

在Go语言的发展史中,2018年注定是一个重要的时间点,因为在2018年8月正式发布了Go1.11。Go1.11语言部分虽然没有变化,但是带来了3个重量级的更新:一是amd64平台完全支持AVX512高性能的指令集;二是Go1.11开始支持模块化的特性;三是Go语言开始WebAssembly平台。这几个个改进将成为后Go1时代最大的亮点。

首先AVX512高性能的指令集可以让Go语言榨干CPU的全部性能,为Go2进军运算密集型应用做好准备(如果对Go汇编语言感兴趣,可以参考作者的《Go语言高级编程》中汇编语言相关的章节)。而模块是管理任何大型工程必备的工具,但是Go语言发布十年来一直缺乏官方的模块化工具。模块化的特性将彻底解决大型Go语言工程的管理问题,至此Go1除了缺少泛型等特性已经近乎完美。最后,WebAssembly作为一个Web汇编语言和虚拟机标准,Go语言可能为Web开发打开一个崭新的领域。

关于模块和WebAssembly都是较大的主题,它们目前都还是作为实验特性,希望在后序版本中逐步完成。在本书将有专门的章节讨论模块和WebAssembly相关的技术。

1.3.2 Go1.12(2019年2月)

Go1.12并没有增加新的语言特性,但是官方正式决定在下个Go1.13版本中删除对二进制包的支持。二进制包的是在Go1.7版本作为实验性的特性引入的,一个包可以以类似C语言静态库的方式采用二进制包发布,从而避免公布源代码。在Go语言不支持二进制包特性的时候,社区对这个需求呼声甚高,但是当官方真正支持了之后却根本没有人使用。Go语言官方删除二进制包的决定也是Go的“少即是多”的哲学决定的,而正是这种极度的克制的基因才造就了目前的Go语言成功。

1.3.3 Go1.13(2019年8月)

从Go1.13开始,从Go1.11开始酝酿的诸多决定终于开始逐个生效:首先是模块化将成为默认的特性,彻底告别GOPATH时代;其次是不是太重要的二进制特性将被废除;最后是语言的进化将再次启动,一些细微的语言特性将在Go2到来之前被提前实现。

最有可能被优先实现的特性有:数字支持下划线分割的特性,以便于书写更容易阅读的数字,比如100000000可以写为1_0000_0000;其次Go语言将引入二进制的数字字面值,比如0b00001111是以二进制格式书写的整数。这虽然是很小的语法糖改进,但是标志了Go2语言的开发工作正逐步进入开发计划。