go团队在发布1.11版本后6个月,发布了go 1.12,这个版本没有添加语言功能,但是加入了tls 1.3,并改进了模块支持,为即将在go 1.13成为默认做准备,另外还支持windows arm系统,同时也改进了macos和ios向前兼容性。
go 1.12加入了对tls 1.3的支持,开发者可以在godebug环境变量中增加tls13=1激活,而官方预告,tls 1.3在go 1.13将会默认激活。除了在connectionstate中的tlsunique以及重新协商功能外,所有的tls 1.2功能都可以在tls 1.3中使用,并获得相同或更好的安全性和性能。
虽然tls 1.3向后兼容以前的版本,但是部分老旧系统可能无法正确执行,像是rsa凭证密钥太小不安全,就无法和tls 1.3一起使用。 tls 1.3密码组件无法配置,官方提到,所有密码组件的支持都是安全的。
另外,目前不支持早期数据(early data,0-rtt模式),而且当客户端送出早期数据,go 1.12服务器也不支持略过意料之外的早期数据,因为在tls 1.3 0-rtt模式,客户端会留存服务器支持0-rtt的状态,因此go 1.12服务器所在的负载均衡池,不能有部分服务器支持0-rtt。当客户端要转换域名,从一个支持0-rtt的服务器转到go 1.12服务器上,则必须在切换前禁用0-rtt,以保持运行不中断。
在模块支持方面,当go111module选项设为激活时,go命令现在支持在模块目录之外的模块感知操作,不过,前提是这些操作不需要解析相对于当前目录的导入路径,或也不需要明确地编辑go.mod文件。下载和解压缩模块的go命令,现在可以安全的同时使用。
go.mod文件现在会指示该模块使用的语言版本,如果没有存在当前版本,系统则转而使用go 1.12,当模块指定的语言版本比工具链的还要新,则go命令会直接尝试构建,除非构建失败才会发出通知。