内容简介:本博已经在Go语言将在1.13版本中引入的变化一文中介绍了Go 1.13将对语法和标准库做出的增强。其实, 官方Go SDK 1.13也将带来很多新的变化。本篇文章下面将介绍一下这些变化。Go SDK 1.13之前,很多可以安全地开辟在栈上的内存因为编译器中的逃逸分析器不够智能的原因而被开辟在了堆上。这在一定程度上影响了程序执行效率。从Go SDK 1.13开始,标准编译器将采用一个新的逃逸分析器,从而将避免很了多不必要的在堆上开辟内存的情况。Go SDK 1.13之前,所有的defer延迟调用都是记录在堆
本博已经在 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
环境变量。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google是如何控制世界的
(美)丹尼尔·伊克比亚 / 李军 / 东方出版社 / 2008-08 / 36.00元
秘Google的发展之路! Google,这个有着数百亿的网页存储量、每天两亿搜索次数的搜索引擎,最初仅仅是一个方程式。这个由拉里·佩奇和塞吉·布林两位天才创造出的超级算法甚至比可口可乐的配方还要保密。 当广告公司为自己网页在搜索结果中的排序争得头破血流时,Google正悠然地坐收渔翁之利,这种天才的拍卖广告链接的商业模式给Google带来了令人瞠目结舌的企业利润!仅仅从1999~20......一起来看看 《Google是如何控制世界的》 这本书的介绍吧!