本博已经在Go语言将在1.13版本中引入的变化一文中介绍了Go 1.13将对语法和标准库做出的增强。其实, 官方Go SDK 1.13也将带来很多新的变化。本篇文章下面将介绍一下这些变化。
Go SDK 1.13之前,很多可以安全地开辟在栈上的内存因为编译器中的逃逸分析器不够智能的原因而被开辟在了堆上。这在一定程度上影响了程序执行效率。从Go SDK 1.13开始,标准编译器将采用一个新的逃逸分析器,从而将避免很了多不必要的在堆上开辟内存的情况。
Go SDK 1.13之前,所有的defer延迟调用都是记录在堆上的,这严重影响了defer延迟调用的执行效率。从Go SDK 1.13开始,满足某些条件的某些defer延迟调用(标准库中93%的延迟调用满足此条件)将被记录在栈上而不是堆上,从而提高了defer延迟调用的执行效率。
官方Go runtime 1.13将对sync.Pool
中的对象回收时机策略做出调整。在1.12版本及以前的版本中,在每轮垃圾回收过程中,每个sync.Pool
实例中的所有缓存对象都将被无条件回收掉。从1.13版本开始,如果一个sync.Pool
实例在上一轮垃圾回收过程结束之后仍然被使用过,则其中的缓存对象将不会被回收掉。此举对于使用sync.Pool来提升效率的程序来说,将大大减少周期性的因为缓存被清除而造成的瞬时效率下降。
从Go SDK 1.13开始,编译输出的二进制可执行文件中将包含所用Go编译器的版本和此执行文件所依赖的各种第三方库包的版本号。我们可以使用命令go version binaryfile
来查看一个二进制可执行文件是使用哪个版本的编译器编译的,或者使用命令go version -m binaryfile
来查看包含在一个二进制可执行文件中的各个第三方依赖库包的版本号。
经过Go 1.11和Go 1.12近一年时间的磨合,Go modules版本依赖管理特性将从Go SDK 1.13开始大规模推荐使用。GOPATH
环境变量的地位将减弱甚至丧失。GOBIN
环境变量的地位将提升,因为go install
命令仍需要一个路径来存储生成的二进制可执行文件。另外,伴随Go modules而生的GOPROXY
环境变量的设置格式得到了增强。我们可以使用下面的格式来指定多个代理:
GOPROXY=proxy1,proxy2,proxy3
go
命令在需要下载库包的时候将逐个试用设置中的各个代理,直到发现一个可用的为止。特别地,direct
表示直连。一个设置例子:
GOPROXY=direct,https://proxy.golang.org,https://myproxy.mysite:8888
GOPROXY
环境变量可以帮助我们下载墙外的第三方库包。当然,通过设置https_proxy
环境变量设也可以达到此目的。但是一个公司通过在内部架设一个自己的goproxy服务器来缓存第三方库包,库包下载速度可能会更快。
为了防止出现node.js社区中大量的在使用npm时造成的不经意间引入木马库包的情况,Go官方推出了Go checksum database(sumdb):https://sum.golang.org。go
命令将在必要的时候连接此服务来检查下载的第三方依赖包的哈希是否和sumdb的记录相匹配。有些遗憾,和proxy.golang.org类似,sum.golang.org也被墙了。但是我们同样可以设置https_proxy
代理或者架设自己的sumdb服务器来解决这个问题。GOSUMDB
环境变量用来设置第三方sum database服务器地址,其默认值为https://sum.golang.org。我们可以将其值设为off
来关闭哈希检查,go
命令的选项-insecure
发挥同样的作用。当然,为了安全起见,一般情况下最好不要关闭哈希检查。
在设置了GOPROXY
环境变量的情况下,我们可以设置GONOPROXY
环境变量来设置不需要通过goproxy服务器来下载的库包。在设置了GOSUMDB
环境变量的情况下,我们可以设置GONOSUMDB
环境变量来设置不需要哈希检查的库包。
通过以上介绍,我们可以看到,go
命令需要的环境变量增加了不少。为了管理这些环境变量,go env
子命令添加了一个选项-w
,用来设置全局go
环境变量。比如,在Linux系统上,命令go env -w GOBIN=$HOME/bin
用来设置GOBIN
环境变量。
有疑问加站长微信联系(非本文作者)