2月16号,Go 团队发布了 Go1.16 版本,这个版本虽然依然没有给开发者带来泛型有些许遗憾(泛型提案已经被采纳,下半年版本发布),但还是更新了许多新事物,值得尝鲜。

总的来说,1.16 版本有别于 1.15 即之前更早版本,换句话说,就是若要想从 1.15 及以下版本升级到 1.16 版本,可能需要改动一些之前的代码。因为部分包名被弃用了,并改成了新的包名。

那么 Go1.16 更新了哪些内容呢?

01 支持类注解方式加载静态资源

首先最大的改动,莫过于新增了embed包,使用注解方式来指定文件所在的路径,从而使得相对文件的读取和加载更加便捷。毕竟在go build的时候会直接将静态资源嵌入到二进制包中。

笔者思考:在云原生越来越普及的大环境下,越来越多的服务部署在容器中,很多场景下已经不是很有必要去读取相对路径下的静态资源了,所以笔者认为,这个集成的功能可以让一些本地配置文件类的加载更加方便,并且在部署的时候不用对静态资源做额外的拷贝。所以对embed包的功能,仁者见仁,智者见智吧~

02 交叉编译支持更多系统&架构

不得不说,golang的交叉编译使得golang具备可以在任意源平台开发,再在任意目标平台运行的能力。随着Mac支持arm架构的芯片,golang也将补充支持对arm架构的支持。

  • 新增架构支持GOARCH=arm64
  • 新增操作系统支持 GOOS=ios
  • 新增支持交叉编译中使用cgo CGO_ENABLED=1,这个在以往版本是不支持的哦!

03 依赖管理强力推行gomodule

go的依赖管理一直是被外行比较诟病的地方之一,但有了vendor和gomodule的支持后,依赖管理也变得非常简单。

  • go1.16版本则默认启用gomodule来管理项目依赖,偷偷的自动改为GO111MODULE=on了哦!
  • go install可以安装指定版本了
  • go get会自动帮你修改go.mod
  • go build则不会再自动帮你修改go.mod和go.sum

总而言之,golang越来越便捷,期待越来越好!

04 支持设定从信任源下载依赖包

在以前的版本,go get命令是可以从任意地方下载资源的,但可能这些源不一定是可靠的。所以1.16新增了对下载源的限制配置GOVCS(新环境变量)

笔者认为:在大型公司/团队背景下,很多时候对第三方依赖的代码检测是很难做到100%的安全扫描的,govcs添加了源的信任配置,在软件代码安全上加上了一道防火墙。

05 新旧包交替:部分代码可能被标记为弃用

go团队对代码层次的设计是煞费苦心的。很多被认为设计不合理的包都做了相关的调整,如:

  • ioutil下的包都重新挪到了io包下面,因为ioutil被认为功能太杂太乱了,最常见的如ioutil.ReadAll就被移到了io.ReadAll。
  • 以前os包和io包都各自有对文件系统的抽象,为了统一,1.16新增了io/fs包,统一抽象文件系统

所以,如果项目要从更早的版本升级到1.16+,则很可能需要改动老旧项目的相关代码(当然你也可以仍然使用原有代码,但某些方法会被标记为弃用)。但升级到新版可以获得更加的性能/便捷,业务项目按需升级也是大势所趋。

06 其他功能更新

如编译器的性能优化,内存优化(较1.15减少了5%-15%)等.