Go 1.9 (2017-08-24)
Go 1.9 于 2017 年 8 月 24 日发布。此版本包含两个语言层面的变更(类型别名),并在标准库中引入了 sync.Map、math/bits 等重要新特性,同时改进了 time 包对单调时间的支持。
主要变化
语言
- 类型别名 (Type Aliases): Go 1.9 引入了类型别名语法,主要用于支持大规模代码重构(例如将类型从一个包移动到另一个包),实现平滑过渡。
- 语法:
type T1 = T2。声明T1是T2的别名,它们表示同一个类型。 - 区别:这与类型定义 (
type T1 T2) 不同,类型定义会创建一个新的、不同的类型。
- 语法:
工具链
- 并行编译 (Parallel Compilation): Go 编译器现在支持包内函数的并行编译。利用多核 CPU 显著加快了编译速度。这是在现有的包级别并行编译基础上的进一步优化。
- 测试辅助函数 (Test Helper):
testing包引入了Helper方法。t.Helper()标记当前函数为测试辅助函数。当测试失败打印日志时,Go 会跳过该函数,直接显示调用该辅助函数的测试代码行号,方便定位问题。 go test -list:新增-list参数,接受正则表达式,列出匹配的测试、基准测试或示例名称而不运行它们。./...匹配规则:./...模式现在不再匹配vendor目录下的包。要匹配 vendor 目录,需显式使用./vendor/...。
运行时
- GC 性能:大对象分配性能显著提升,
runtime.ReadMemStats在大堆内存下的耗时大幅降低(< 100µs)。
标准库
-
sync.Map: 标准库新增了sync.Map,这是一个并发安全的 Map 实现。- 适用场景:Key 稳定且读取远多于写入的缓存场景;多个 Goroutine 读写不相交的 Key 集合。
- 特点:无需额外的锁或协调即可安全使用。
var m sync.Map
m.Store("key", "value")
v, ok := m.Load("key") -
单调时间 (Monotonic Time):
time包现在透明地支持单调时间(Monotonic Time)。- 改进:
time.Now()返回的Time值除了包含墙上时钟(Wall Clock)时间外,还包含单调时钟读数。 - 影响:计算两个时间点之间的间隔 (
t2.Sub(t1)) 现在总是正数且准确的,即使在系统时间被调整(如 NTP 同步)的情况下。
- 改进:
-
math/bits包: 新增了math/bits包,提供了针对无符号整数的位操作函数。编译器会将该包中的许多函数(如Len,OnesCount,RotateLeft等)直接编译为底层 CPU 指令,提供极致的性能。
参考资源
更多详细信息请参考官方发布说明:Go 1.9 Release Notes