tutorial,

golang 1.19 工具、运行时、库、性能,改良版

前言

8 月 2 日,Go 团队发布了 Go 1.19,该版本主要是对 Go 1.18 的改进。Go 1.19 大部分更改都在工具链运行时的实现中。与往常一样,该版本保持了 Go 1 的兼容性承诺,几乎所有 Go 程序都能像以前一样继续编译和运行。

语言

对方法声明中类型参数的范围进行了修正,详见 https://tip.golang.org/ref/spec#Declarations_and_scope

Go 1.19 解决了一些泛型的问题,并且提升了泛型性能(某些泛型程序高达 20%)。

内存模型

Go 内存模型现在明确定义了 sync/atomic 包的行为。happens-before 关系的正式定义已被修改,以与 C、C++、Java、JavaScript、Rust 和 Swift 使用的内存模型保持一致。现有程序不受影响。随着内存模型的更新, sync/atomic 包中还有新的类型,例如 atomic.Int64atomic.Pointer[T],以便更容易使用原子值

工具

文档

文档注释现在支持链接、列表和更清晰的标题语法。此更改有助于用户编写更清晰、更容易浏览的文档注释,尤其是在具有大型 API 的包中。作为此更改的一部分,gofmt 现在重新格式化文档注释以将标准格式应用于这些功能的使用。有关所有详细信息,可参阅 Go Doc Comments

新的 unix 构建约束

unix 现在可以按 //go:build 行识别构建约束。如果目标操作系统(也称为 GOOS)是 Unix 或类 Unix 系统,则满足约束。对于 1.19 版本,如果 GOOS 是 aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, 或中的一个则满足 solaris。在未来的版本中,该 unix 约束可能与其他新支持的操作系统相匹配。

出于安全原因os/exec 包不再遵循 PATH 查找中的相对路径。有关详细信息,可参阅 package 文档golang.org/x/sys/execabs 的现有用途可以在仅使用 Go 1.19 或更高版本构建的程序中移回 os/exec

运行时

垃圾收集器增加了对软内存限制的支持,在新的垃圾收集指南中有详细讨论。该限制对于优化 Go 程序以在具有专用内存量的容器中尽可能高效地运行特别有用

动态调整初始 goroutine 堆栈以减少堆栈复制

在大多数 Unix 系统上自动使用附加文件描述符

在 ARM64 上添加了对调试器注入函数调用的支持,使用户能够在使用经过更新以利用此功能的调试器时,在交互式调试会话中从其二进制文件调用函数。

Ports

Go 1.19 增加了对龙芯 64 位架构 LoongArch ( GOARCH=loong64) 和 RISC-V 上的 register ABI 支持 的支持。

编译器

编译器现在使用跳转表来实现大整数和字符串 switch 语句。switch 语句的性能改进各不相同,但可以快 20% 左右。(只支持 GOARCH=amd64GOARCH=arm64

Go 编译器现在需要 -p=importpath 标志来构建可链接的目标文件。这已经由 go 命令和 Bazel 提供。任何其他直接调用 Go 编译器的构建系统都需要确保它们也传递了这个标志。

Go 编译器不再接受 -importmap 标志。直接调用 Go 编译器的构建系统必须使用该 -importcfg 标志。

小结

Go 1.19 是对 Go 1.18 的改进版,在工具链运行时都有提升,值得升级。有关 1.19 中所有内容的更详细说明,请参阅发行说明

参考链接

延伸阅读


CatchZeng
Written by CatchZeng Follow
AI (Machine Learning) and DevOps enthusiast.