Go 各版本特性

Go 1.13 新特性 详细

Go 1.13将对语法和标准库做出的增强。

  • 从Go SDK 1.13开始,标准编译器将采用一个新的逃逸分析器,从而将避免很了多不必要的在堆上开辟内存的情况。

  • 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 modules版本依赖管理特性将从Go SDK 1.13开始大规模推荐使用。模块模式将成为默认模式。GOPATH环境变量的地位将减弱甚至丧失。GOBIN环境变量的地位将提升,因为go install命令仍需要一个路径来存储生成的二进制可执行文件。另外,伴随Go modules而生的GOPROXY环境变量的设置格式得到了增强。我们可以使用下面的格式来指定多个代理:

    1. GOPROXY=proxy1,proxy2,proxy3

    go命令在需要下载库包的时候将逐个试用设置中的各个代理,直到发现一个可用的为止。特别地,direct表示直连。一个设置例子:

    1. 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.orggo命令将在必要的时候连接此服务来检查下载的第三方依赖包的哈希是否和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 1.12 新特性 详细

  • 提升了大量堆(Heap)活跃状态情况下的清理性能,这减少了垃圾回收之后的分配延迟,可以更好地将内存释放回操作系统;Runtime 的 timer 和 deadline 代码随着 CPU 数目的增加,会有更好的表现。这提升了网络连接最后期限(deadline)相关操作的性能;对大型堆分配的相关修复,提升了内存配置文件的精确性;
  • Go 1.12 在 RFC 8446 指定的crypto/tls包中添加了对 TLS 1.3 的选择支持。可以通过将值 tls13 = 1 添加到 GODEBUG 环境变量来启用它。 它将在 Go 1.13 中默认启用。
  • 正式官方的包依赖管理工具(go modules),在Go 1.12进一步完善。

Go 1.11 新特性 详细

最新的Go版本1.11版本在Go 1.10之后六个月到达。它的大部分变化都在于工具链,运行时和库的实现。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。

Go 1.10 新特性 [详细](https://golang.org/doc/go1.10)

最新的Go版本1.10版本在Go 1.9发布六个月后推出。它的大部分变化都在于工具链,运行时和库的实现。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。

此版本改进了构建的包的缓存

添加了成功测试结果的缓存,在测试期间自动运行vet,并允许使用cgo直接在Go和C之间传递字符串值

新的编译器选项白名单可能会invalid flag在使用旧版本成功构建的代码中导致意外错误。

Go 1.9 新特性 详细

最新的Go版本1.9,在Go 1.8发布六个月后推出,是Go 1.x系列的第十个版本。该语言有两处更改:添加对类型别名的支持,以及定义实现何时融合浮点运算。大多数更改都在工具链,运行时和库的实现中。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。

Go 1.8 新特性 详细

最新的Go版本1.8版本在Go 1.7发布六个月后推出。它的大部分变化都在于工具链,运行时和库的实现。语言规范有两个小的变化。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。

Go 1.7 新特性 详细

最新的Go版本1.7,在1.6之后的六个月到来。它的大部分变化都在于工具链,运行时和库的实现。语言规范有一个小的改动。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。

Go 1.6 新特性 详细

Go 1.6 发布了,该版本在语言本身层面并没有任何变化,主要改进包括:

  • 默认使用 cgo 外部 C 编译器
  • 支持 HTTP/2 协议
  • 增加对 64 位 MIPS 的体验支持 (Linux)
  • 增加对 32 位 x86 上的 Android 的体验支持
  • 在 FreeBSD 上 go 1.6 默认使用 clang 而不是 gcc 作为外部 C 编译器

Go 1.5 新特性 详细

最新的Go版本1.5版是一个重要版本,包括对实现的主要体系结构更改。尽管如此,我们希望几乎所有Go程序都能像以前一样继续编译和运行,因为该版本仍然保持Go 1 承诺的兼容性

实施的最大进展是:

  • 编译器和运行时现在完全用Go编写(带有一点汇编程序)。C不再参与实现,因此曾经构建分发所必需的C编译器消失了。
  • 垃圾收集器现在是并发的,并且在可能的情况下与其他goroutine并行运行,从而显着降低了暂停时间。
  • 默认情况下,Go程序运行时GOMAXPROCS设置为可用的核心数; 在之前的版本中它默认为1。
  • 现在为所有存储库提供了 对内部包的支持,而不仅仅是Go核心。
  • go命令现在为“销售”外部依赖项提供实验支持
  • go tool trace命令支持细粒度的程序执行跟踪。
  • 为命令行使用自定义 新go doc命令(不同于godoc)。
  • 该版本还包含一个涉及地图文字的小语言更改。

发布历史

links