Go 博客

Go 1.22 发布了!

Eli Bendersky,代表 Go 团队
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
        }()
    }

    // 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} 段的值捕获到一个 map 中,可以通过 Request 值访问。

  • database/sql 中的新类型 Null[T] 提供了一种扫描可空列的方法。

  • slices 包中添加了一个 Concat 函数,用于连接任意类型的多个切片。


感谢所有通过编写代码和文档、提交 bug、分享反馈以及测试发布候选版本为本次发布做出贡献的人。您的努力帮助确保 Go 1.22 尽可能稳定。一如既往,如果您发现任何问题,请提交问题

尽情享受 Go 1.22 吧!

下一篇文章:Go 1.22 的路由增强
上一篇文章:分享您关于使用 Go 开发的反馈
博客索引