Go 1.17
Aug 17, 2021 21:30 · 576 words · 2 minute read
在 Go 1.16 发布六个月之后,1.17 终于来了。主要的改动都在工具链、运行时和标准库的实现。Go 1.17 一如既往遵守 Go 1 的兼容性约定,几乎所有 Go 程序都能和之前一样编译和运行。
语言方面
- 将切片转换为数组指针:
[]T
类型现在可以被转换成数组指针类型*[N]T
unsafe.Add
方法unsafe.Slice
方法
平台
主要新增了对 64-bit ARM 架构 Windows 的支持,包括 cgo。
工具
Go 命令
go mod tidy -go=1.17
将现有模块的 go.mod 文件转换为 Go 1.17 版本不改变其依赖。
构建约束
用新的 //go:build
注释取代 // +build
,并且支持布尔表达式。
老的注解:
// +build linux
// +build 386
新的注解:
//go:build linux && 386
Gofmt
gofmt 现在会同步 //go:build
注释与 // +build
注释(在 // +build
上面添加一行 //go:build
)。
Vet
新增以下警告:
//go:build
与// +build
不匹配警告- 无缓冲 channel 调用
calling signal.Notify
警告 - Is、As 和 Unwrap 同名方法
编译器
Go 1.17 实现了一种使用寄存器代替堆栈传递函数参数和结果的新方法,使得程序性能提高了 5% 左右而二进制体积降低了约 2%。目前已在 64 位的 x86 架构的 Linux、macOS 和 Windows 平台启用。
链接器
通过 -Wl
、--dynamic-linker
选项使用外置链接器。
核心库
Cgo
runtime/cgo 包提供了一个新的工具可以将任意 Go 的值转换成安全的表达,用于在 C 和 Go 之间安全地传递值。
URL query 解析
Go 1.17 之前 example?a=1;b=2&c=3 URL 对象的 Query 方法返回 map[a:[1] b:[2] c:[3]] 而现在只返回 map[c:[3]]。
其他标准库的小改变请查看官方说明:https://golang.org/doc/go1.17#minor_library_changes