原文在这里

由 Eli Bendersky代表Go团队发布于2024年2月6日

今天Go团队发布了Go 1.22,你可以在下载页面查看。

Go 1.22 带来了一系列重要的新功能和提升。以下是一些值得注意的变化;有关完整列表,请参阅发布说明。

语言层面的改变

此前一直存在的for循环陷阱,即在迭代之间意外共享循环变量的问题现在已得到解决。从Go 1.22开始,以下代码将以某种顺序打印abc

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(包含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吧!!!


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特