Go 1.19 (2022-08-02)
Go 1.19 版本于 2022 年 8 月发布,主要完善了泛型支持、改进了文档注释,并引入了重要的内存管理特性。
主要变化
语言
- 内存模型: 更新了 Go 内存模型文档,明确了原子操作的行为,与 C++20、Java、Rust 等语言的内存模型保持一致。Go 仅提供顺序一致(sequentially consistent)的原子操作。
- 泛型: 修复了 Go 1.18 中发现的一些泛型相关的 bug 和限制。对方法声明中类型参数的作用域做了一个微小的修正。
工具链
-
Doc Comments: 支持更丰富的文档注释格式,包括标题、列表和链接。
gofmt现在会重新格式化文档注释。// Package json implements encoding and decoding of JSON as defined in
// [RFC 7159]. -
构建约束: 新增
unix构建约束,当GOOS为类 Unix 系统(如 linux, darwin, freebsd 等)时满足。 -
Go Command:
go build注入的构建信息现在包含-trimpath标志(如果设置了的话)。
运行时
- GC 软内存限制: 引入
GOMEMLIMIT环境变量和runtime/debug.SetMemoryLimit函数,允许设置软内存限制。这有助于 GC 更好地利用可用内存,避免 OOM,特别是在容器环境中。 - 动态栈大小: 提高了 goroutine 初始栈的大小调整策略,基于历史平均使用情况分配,减少栈复制和扩容开销。
- 文件描述符限制: 在 Unix 系统上,导入
os包会自动将打开文件描述符的软限制提高到硬限制的最大值。
标准库
sync/atomic: 新增了类型化的原子类型(Bool,Int32,Int64,Uint32,Uint64,Uintptr,Pointer),使用更加方便安全,避免了手动转换unsafe.Pointer。net/url: 引入JoinPath函数和URL.JoinPath方法,方便安全地拼接 URL 路径。os/exec:Command和LookPath不再默认在当前目录下查找可执行文件(为了安全)。新增Cmd.Environ方法。sort: 排序算法重写为 pattern-defeating quicksort,在多种场景下速度更快。新增Find函数。time: 新增Duration.Abs获取绝对值,Time.ZoneBounds获取时区范围。fmt: 新增Append,Appendf,Appendln函数,将格式化数据追加到字节切片。flag: 新增TextVar函数,允许 flag 绑定实现了encoding.TextUnmarshaler接口的自定义类型。
平台支持
- LoongArch: 新增对 LoongArch 64-bit (
linux/loong64) 的支持。 - RISC-V:
riscv64端口现在支持通过寄存器传递函数参数和结果,性能提升约 10%。
参考资源
更多详细信息请参考官方发布说明:Go 1.19 Release Notes