代表 Go 团队的 Eli Bendersky 2024年2月6日
今天,Go 团队非常激动地发布了 Go 1.22,您可以通过访问下载页面来获取。
Go 1.22 带来了几个重要的新功能和改进。以下是一些显著的变化;完整列表,请参阅发布说明。
语言变化 长期存在的“for”循环陷阱,即循环变量在迭代之间意外共享的问题现在已经得到解决。从 Go 1.22 开始,以下代码将以某种顺序打印“a”、“b”和“c”:
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// 等待所有协程完成后再退出
for _ = range values {
<-done
}
}
有关此更改的更多信息以及帮助代码避免意外破坏的工具,请参阅之前的循环变量博客文章。
第二个语言变化是支持对整数进行范围遍历:
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(10 - i)
}
fmt.Println("go1.22 已经起飞!")
}
此倒计时程序中的 i 值从 0 到 9,包括 9。更多详情,请参考规范。
性能改进 Go 运行时的内存优化提高了 1-3% 的 CPU 性能,同时也减少了大多数 Go 程序的内存开销约 1%。
在 Go 1.21 中,我们为 Go 编译器提供了基于剖析的优化(PGO),这一功能持续得到改进。在 1.22 中添加的一项优化是改进的去虚拟化,允许更多接口方法调用的静态分派。大多数程序启用 PGO 后将看到 2-14% 的改进。
标准库新增 一个新的 math/rand/v2 包提供了一个更干净、更一致的 API,并使用了更高质量、更快速的伪随机生成算法。请参见提案了解额外细节。
net/http.ServeMux 使用的模式现在接受方法和通配符。
例如,路由器接受像 GET /task/{id}/ 这样的模式,它只匹配 GET 请求,并在可以通过 Request 值访问的 map 中捕获 {id} 段的值。
在 database/sql 中,一个新的 Null[T] 类型提供了一种扫描可空列的方法。
在 slices 包中添加了一个 Concat 函数,用于连接任何类型的多个切片。
感谢所有通过编写代码和文档、提交错误、分享反馈以及测试候选版本来贡献此次发布的人。你们的努力帮助确保 Go 1.22 尽可能稳定。一如既往,如果您发现任何问题,请提交问题。
享受 Go 1.22 吧!