Go 1.17

Aug 17, 2021 21:30 · 576 words · 2 minute read Golang

Gopher

Go 1.16 发布六个月之后,1.17 终于来了。主要的改动都在工具链、运行时和标准库的实现。Go 1.17 一如既往遵守 Go 1 的兼容性约定,几乎所有 Go 程序都能和之前一样编译和运行。

语言方面

平台

主要新增了对 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