Go 1.22 is released!

2024-02-21 17:11:34 浏览数 (1)

原文在这里[1]。

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

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

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

语言层面的改变

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

代码语言:javascript复制
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
    }
}

有关此更改以及有助于防止代码意外中断的工具的更多信息,请参阅先前的循环变量博客[4]。

第二个语言层面的变化是支持对整数范围遍历:

代码语言:javascript复制
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)。更多详情,请参考规范[5]。

性能提升

在Go运行时中进行的内存优化提高了CPU性能约1-3%,同时还将大多数Go程序的内存开销减少约1%。

在Go 1.21中,我们为Go编译器引入了基于性能剖析的优化(PGO)[6],并且这项功能持续改进。在1.22中新增的一项优化是改进了虚函数优化,使得更多接口方法调用可以进行静态分派。大多数启用PGO的程序将得到2-14%的性能改进。

标准库增加

•一个新的math/rand/v2[7]包提供了一个更清晰、更一致的API,并使用了更高质量、更快速的伪随机生成算法。请参阅提案[8]以获取更多详细信息。•net/http.ServeMux[9]现在可以接受方法和通配符。例如,路由器接受类似GET /task/{id}/的模式,它仅匹配GET请求并捕获id段的值,可以通过Request[10]值访问。•database/sql包中新增了一个Null[T]类型,提供了一种扫描可空列的方式。•在slices包中添加了Concat函数,用于连接任意类型的多个切片。


感谢所有通过编写代码和文档、提交错误、分享反馈以及测试发行候选版而为这个版本做出贡献的人们。你们的努力有助于确保Go 1.22尽可能稳定。如有问题,请随时提交问题[11]报告。

尽情享受Go 1.22吧!!!

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[12]进行许可,使用时请注明出处。 Author: mengbin[13] blog: mengbin[14] Github: mengbin92[15] cnblogs: 恋水无意[16] 腾讯云开发者社区:孟斯特[17]

0 人点赞