# 1.3 Go1.10过渡到Go2


# 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语言高级编程》](https://github.com/chai2010/advanced-go-programming-book)中汇编语言相关的章节）。而模块是管理任何大型工程必备的工具，但是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语言的开发工作正逐步进入开发计划。

<!--
https://github.com/golang/proposal/blob/master/design/19113-signed-shift-counts.md
https://github.com/golang/proposal/blob/master/design/19308-number-literals.md
* 中文名导出
-->
