Go 博客
Go 1.22 发布!
今天,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
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
有关此更改以及有助于防止代码意外中断的工具的更多信息,请参阅之前的循环变量博客文章。
第二个语言更改是支持遍历整数
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(10 - i)
}
fmt.Println("go1.22 has lift-off!")
}
此倒计时程序中i
的值从 0 到 9(含)。有关更多详细信息,请参阅规范。
性能改进
Go 运行时的内存优化将 CPU 性能提高了 1-3%,同时还将大多数 Go 程序的内存开销降低了约 1%。
在 Go 1.21 中,我们发布了Go 编译器的配置文件引导优化 (PGO),并且此功能仍在不断改进。1.22 中添加的优化之一是改进的反虚拟化,允许对更多接口方法调用进行静态分派。启用 PGO 后,大多数程序的性能将提高 2-14%。
标准库新增功能
-
新的math/rand/v2包提供了更简洁、更一致的 API,并使用更高质量、更快的伪随机生成算法。有关更多详细信息,请参阅提案。
-
net/http.ServeMux使用的模式现在接受方法和通配符。
例如,路由器接受类似
GET /task/{id}/
的模式,该模式仅匹配GET
请求并在映射中捕获{id}
段的值,可以通过Request值访问。 -
database/sql中的新
Null[T]
类型提供了一种扫描可空列的方法。 -
在slices包中添加了
Concat
函数,用于连接任何类型的多个切片。
感谢所有通过编写代码和文档、提交错误、分享反馈以及测试候选版本为此次发布做出贡献的人。你们的努力帮助确保 Go 1.22 尽可能稳定。与往常一样,如果您发现任何问题,请提交问题。
享受 Go 1.22!
下一篇文章:Go 1.22 的路由增强功能
上一篇文章:分享您对使用 Go 进行开发的反馈
博客索引