Go 博客
Go 1.9 发布了
今天,Go 团队很高兴宣布 Go 1.9 发布。你可以从下载页面获取它。该版本在语言、标准库、运行时和工具方面进行了许多更改。本文涵盖了最重要且显著的更改。此版本的大部分工程工作都投入到了运行时和工具的改进中,这使得公告本身不那么令人兴奋,但它仍然是一个很棒的版本。
语言最重要的变化是引入了类型别名:这是一项旨在支持渐进式代码修复的功能。类型别名声明的形式为
type T1 = T2
这个声明为类型 T2
引入了一个别名 T1
,就像 byte
一直是 uint8
的别名一样。类型别名设计文档和一篇关于重构的文章更详细地介绍了这一新增功能。
新的 math/bits 包提供了无符号整数的位计数和操作函数,在可能的情况下通过特殊的 CPU 指令实现。例如,在 x86-64 系统上,bits.TrailingZeros(x)
使用 BSF 指令。
sync
包新增了一个新的 Map 类型,它是并发安全的。你可以从其文档中阅读更多关于它的信息,并通过此 GopherCon 2017 闪电演讲(幻灯片)了解更多关于其创建原因。它不是 Go 的 map 类型的通用替代品;请查阅文档了解何时应该使用它。
testing
包也有一个新增功能。新添加的 Helper
方法,被添加到 testing.T 和 testing.B 中,将调用函数标记为测试辅助函数。当 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 用户组正在举办发布派对。