Go 博客

Go 1.9 发布

Francesc Campoy
2017年8月24日

Go 团队今天很高兴地宣布 Go 1.9 的发布。您可以从下载页面获取。语言、标准库、运行时和工具链都有许多更新。本文档涵盖了最显著的更新。本次发布的大部分工程精力都投入到了运行时和工具链的改进上,这使得本次发布声明不那么激动人心,但仍是一个伟大的版本。

语言中最重要的一项变化是引入了类型别名:这项功能旨在支持渐进式代码重构。类型别名声明的形式如下:

type T1 = T2

此声明引入了一个类型别名T1,其底层类型为T2,这与byte一直是uint8的别名方式相同。关于类型别名设计文档的设计文档以及一篇关于重构的文章对此新增内容进行了更详细的介绍。

新的math/bits包为无符号整数提供了位计数和位操作函数,并在可能的情况下通过特殊的 CPU 指令实现。例如,在 x86-64 系统上,bits.TrailingZeros(x)使用了BSF指令。

sync包添加了一个新的Map类型,该类型是并发安全的。您可以阅读其文档了解更多信息,并观看这个GopherCon 2017 闪电演讲幻灯片)了解其创建原因。它并不是 Go 原生 map 类型的通用替代品;请参阅文档了解何时应使用它。

testing包也有新增内容。添加到了testing.Ttesting.B的新的Helper方法,将调用函数标记为测试辅助函数。当 testing 包打印文件和行信息时,它会显示调用辅助函数的代码位置,而不是辅助函数本身的某一行。

例如,考虑这个测试

package p

import "testing"

func failure(t *testing.T) {
    t.Helper() // This call silences this function in error reports.
    t.Fatal("failure")
}

func Test(t *testing.T) {
    failure(t)
}

由于failure将自己标识为测试辅助函数,在Test执行期间打印的错误消息将指示第 11 行(即调用failure的地方),而不是第 7 行(即failure调用t.Fatal的地方)。

time包现在会在每个Time值中透明地跟踪单调时间,从而在时钟调整(例如夏令时或闰秒)的情况下,计算两个Time值之间的时间差成为一个安全的操作。例如,即使在闰秒时钟重置的情况下,以下代码现在也能计算出正确经过的时间

start := time.Now()
f()
elapsed := time.Since(start)

有关详细信息,请参阅包文档设计文档

最后,作为提高 Go 编译器速度的努力的一部分,Go 1.9 会并发编译一个包中的函数。

Go 1.9 包含更多添加、改进和修复。请在Go 1.9 发布说明中查找完整的更改列表以及有关上述改进的更多信息。

为了庆祝本次发布,世界各地的 Go 用户组正在举办发布派对

下一篇文章:社区外展工作组
上一篇文章:贡献者研讨会
博客索引