鸽王自白
此文本该写在 Go1.13 版本发布之前……然而我就是传说中的鸽王,放了司徒很多次鸽子。直到 Go1.13 发布了,没有任何理由再拖延,也正好可以借着这一次新版本的发布介绍一下 Go 语言新特性和 Go Team 的变化,以及未来 Go 到底还会朝着怎么样的方向发展。
Go 1.13 带来的新特性
分析的文章有很多,我就不事无巨细地介绍了,这里重点拿几个我自己比较关心的特性来说一下。
1. Go 命令默认使用 Go module
这也是Golang 1.13最重要的一个更新。环境变量 GO111MODULE 的默认值依然是 auto ,但是含义有所不同了:只要当前目录,或者某个父目录包含go.mod文件,那就采用 module 的方式来管理模块及依赖,不管当前目录是否在 GOPATH/src 下面。这里涉及到好几个环境变量,如 GOPROXY、GOPRIVATE、GOSUMDB、GONOPROXY 等。这个可以看一下前几天我们公众号的文章《goproxy.cn 为中国开发者量身打造模块代理》。
2. 对 defer 的使用效率普遍提高了30%
defer 这个功能虽然在开发上面带来了很多的便利性,但是对于深度使用 Go 的同学,很多时候你要调试性能的时候都会遇到这个问题,使用 defer 后的函数开销确实比没使用高了不少。
这个之前在社区里面也经常被吐槽,这一次的提升主要是在延迟对象的堆栈分配规则上带来了改进,但是这个适用于我们大多数的场景。
3. 错误包装
对错误处理的时候,支持嵌套,也就是一个 error 包含在另一个 error 里面。相应的,errors 包中增加了三个新的函数来支持 error 嵌套:errors.Unwrap、errors.Is、errors.As。错误 e 可以通过提供返回 w 的 Unwrap 方法来包装另一个错误 w。e 和 w 都可用于程序,允许 e 为 w 提供额外的上下文或重新解释它,同时仍然允许程序基于 w 做出决策。
为了支持包装, fmt.Errorf 现在有一个 %w 动词用于创建包装错误。
更多的新特性请大家扫码阅读这篇文章作为参考(不用***哦