Go 最新资讯:Go 1.16 正式发布,支持 macOS ARM64 架构

1,897

更多干货:关注公众号奇伢云存储

[toc]

Go 1.16 距离上个 Go 1.15 版本差不多 6 个月,所以这个版本迭代速度还是挺快的。本次更新没有对语言本身做变更,主要更新的是工具链,运行时( runtime ),标准库的一些功能实现和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承诺。

相关地址:

更新命令:

$ go get golang.org/dl/go1.16
$ go1.16 download

多平台指令的支持

Darwin and iOS

  1. Go 1.16 支持 64 位 ARM 架构上的 macOS 操作系统 (Apple Silicon),使用方式通过 GOOS=darwin,GOARCH=arm64
    • 也就是 Apple 发布的最新的 M1 芯片指令集;
  2. 至于之前 iOS 平台上的,则由 darwin/arm64 改名为 ios/arm64
  3. Go 1.16 添加 ios/amd64 的类型;
  4. Go 1.16 运行至少需要的系统版本 >= macOS 10.12 Sierra;

NetBSD

Go 1.16 在 NetBSD(netbsd/arm64)上支持 64 位 ARM 体系架构。

OpenBSD

Go 1.16 在 OpenBSD(openbsd/mips64)上支持 MIPS64 体系架构,不支持 cgo。

386

Go 1.16 放弃了对 x87 模式编译(GO386=387)的支持。现在使用软浮动模式(GO386=softfloat)支持非 SSE2 处理器。在非 SSE2 处理器上运行的用户应替换GO386=387 为GO386=softfloat

RISC-V

Go 1.16 在 linux/riscv64 现在支持 cgo 和 -buildmode=pie 。Go 1.16 对 RISC-V 指令集做了部分的优化。

工具链

Go Command

  1. module-aware 模式成为默认状态。
  2. 支持使用 //go:embed 指令来将静态文件和文件树作为可执行文件的一部分直接内嵌包含在里面。

Cgo

  1. cgo tool 不再翻译 C 语言里的位域字段( C struct bitfields )对应到 Go 的结构体字段了(这一点要非常注意了,在使用 Cgo 的时候,这里没注意到的话,就会导致严重的 bug)。

Vet

  1. 新增对无效测试场景的告警,比如单测某些场景对 Fatal 的无效调用;
  2. 新增对 frame pointer 的告警,这个主要是针对一些汇编代码,破坏了对 bp 寄存器的使用约定,Go 1.16 将会对这种检测出来并告警;
  3. 新增 asn1.Unmarshal 的警告,比如传递非指针对象或者 nil 值;

运行时

  1. 新增 runtime/metrics 包的功能,替代runtime.ReadMemStats 和 debug.ReadGCStats,runtime/metrics 包更通用、稳定、高效;
  2. GODEBUG 环境变量支持跟踪:GODEBUG 环境变量包含inittrace=1 时,Go 运行时将会 trace 输出 package 的 init 函数的执行时间和一些内存分配消耗情况;

编译器

  1. 对内联的复杂场景的识别和优化,比如 Go 1.16 可以内联具有未标记 for 循环,方法值和类型判断的函数。

链接器

  1. 进一步优化链接阶段的性能,减少了链接程序资源的使用(时间和内存),并提高了代码的健壮性/可维护性。Go 1.16 链接平均比Go 1.15 的快20%-25%,消耗的内存减少 5%-15%(linux/amd64 平台数据)。

标准库

  1. io/fs package 定义了fs.FS接口,它是文件只读树的抽象;
  2. 弃用 io/ioutil,存量功能迁出到其他具体的 package。比如 Discard => io.DiscardTempDir => os.MkdirTemp 等等。其实主要是迁入到 io 和 os 这两个 package;
  3. 对 Unicode 标准的支持从 12.0.0 升级为 13.0.0;
  4. net 标准库的实现中,在 Linux 上,在缺失 /etc/hosts 时,主机名查找不再使用 DNS /etc/nsswitch.conf。这个做法常见于基于 Musl 的系统,并使得 Go 程序与这些系统上 C 程序的行为相一致;

总结

  1. Go 1.16 主要是 bugfix 和稳定性的提升,并没有重大的特性变化;
  2. Go 1.16 对多平台多指令架构做了更好的兼容,特别是对 2020 年 Apple 发布的 M1 芯片;
  3. Cgo tool 不再对 C 的位域做转换,这里要注意;
  4. Vet 新增了一些告警检测,让我们的语法检查更全面和安全;
  5. 链接阶段进一步提高了性能,链接速度更快并且耗费资源更少;
  6. Go 1.16 支持了静态资源文件的内嵌;
  7. 标准库 io/util 废弃,存量功能迁移到语义更明确的包,比 io 和 os ;
  8. 标准库 net 对于域名解析的行为和 musl-based 的系统一直;
  9. Unicode 支持升级为 13.0.0;

更多干货:关注公众号奇伢云存储