前言
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.Int64
和 atomic.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=amd64
和 GOARCH=arm64
)
Go 编译器现在需要 -p=importpath
标志来构建可链接的目标文件。这已经由 go 命令和 Bazel 提供。任何其他直接调用 Go 编译器的构建系统都需要确保它们也传递了这个标志。
Go 编译器不再接受 -importmap
标志。直接调用 Go 编译器的构建系统必须使用该 -importcfg
标志。
小结
Go 1.19
是对 Go 1.18
的改进版,在工具链、运行时和库都有提升,值得升级。有关 1.19
中所有内容的更详细说明,请参阅发行说明。
网友评论