Go 1.22 已经发布,了解其新特性和改进

戈兰

Go 是一种并发的编译型编程语言,具有受 C 语法启发的静态类型。

Go 1.22新版本在1.21 版本发布六个月后推出,在工具集、运行时、优化改进、编译器增强和库方面进行了许多显著的变化。

对于不熟悉 Go 语言的人,我应该提一下,它是由 Google 开发的一种编程语言,社区也参与其中,它是一种混合解决方案,结合了编译型语言的高性能和脚本语言的优势,例如易于编写代码、开发速度快和错误保护。

Go 1.22的主要新功能

从 Go 1.22 版本开始引入的新版本中,for 循环有两项显著变化此前,for 循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22 版本中,每次循环迭代都会创建新变量,以防止意外的共享错误。此外,还添加了对 for 循环中 range 函数的实验性支持(GOEXPERIMENT=rangefunc),允许将函数指定为迭代器。for循环中长期存在的协程调用会在迭代之间共享循环变量的问题也得到了解决。此外,for 循环现在可以遍历整数。例如:

package main import "fmt" func main() { for i := range 10 { fmt.Println(10 - i) } fmt.Println("go1.22 起飞!") }

新版本中另一个显著的变化是引入了使用包含工作区依赖项的“ vendor ”目录的功能。现在命令可以使用此目录,该目录通过 ` go work vendor`创建,并在构建命令中,当 ` -mod`设置为“ vendor ”时使用。当工作区中存在“vendor”目录时,默认设置为“ vendor ”。

需要注意的是,在旧版GOPATH模式下, ` go get`命令在模块之外不再受支持但是,其他构建命令(例如`go build` 和 `go test`)将继续对旧版 GOPATH 程序无限期有效。此外, `go mod init`命令将不再尝试从其他供应商工具的配置文件(例如 Gopkg.lock)导入模块依赖项。

Go 1.22 引入了一个新的io/unsafe包,它提供了处理指针和不安全内存的功能。该包提供了将指针从安全类型转换为不安全类型的方法,以及在不检查边界的情况下执行内存复制操作的方法。

我们继续推进基于PGO 代码分析结果的编译器优化工作。现在,编译器使用去虚拟化工具,将各种方法中的间接调用替换为执行展开的内联代码块。启用 PGO 后,这一改进使大多数程序的性能提升了 2% 到 14%。

Windows 版 Go 中,链接到或加载使用-buildmode=c-archive-buildmode=c-shared构建的 Go 库的程序现在可以通过新的runtime/tracetracehook包使用 Windows 事件日志记录 (ETW) API,这些包实现了 Go 事件跟踪收集协议作为 ETW 提供程序。

在其他突出的变化中:

  • 命令 去测试覆盖 现在打印没有自己的测试文件的覆盖包的覆盖摘要。
  • 操作系统/执行,添加了定义上下文属性的功能,允许您设置执行命令的工作目录、环境变量和输入/输出文件描述符等值。
  • 优化运行时内存管理,使大多数应用程序的性能提高 1-3%,内存消耗降低 1%。
  • 埃尔帕克特 网络/http,该功能已添加 关闭空闲连接 发送给HTTP客户端,关闭客户端最近使用过的所有空闲连接
  • 编译器中添加了调用插入机制的改进实验实现 (GOEXPERIMENT=newinliner),它使用启发式方法将重要操作与不重要操作分开。
  • 包已添加 » 数学/兰德/v2 » 标准库,它提供了更一致的 API 并使用更快的算法来生成伪随机数。
  • 埃尔帕克特 网/http.ServeMux 添加了在模板中指定方法和掩码的功能。

最后,如果您有兴趣了解更多信息,可以点击以下链接查看详情。


在 Google 中将其添加为首选来源