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 包也添加了一些内容。新的 Helper 方法添加到 testing.Ttesting.B 中,将调用函数标记为测试辅助函数。当测试包打印文件和行信息时,它会显示调用辅助函数的位置,而不是辅助函数本身中的行。

例如,考虑这个测试

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 用户组正在举行 发布派对

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