Go 博客
Go 1.9 发布
今天,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.T 和 testing.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 用户组正在举行 发布派对。