Go 1.24即将到来!

发布于:2024-12-21 ⋅ 阅读:(10) ⋅ 点赞:(0)

Go 1.24 尚未发布。以下是正在撰写中的发布说明,预计 Go 1.24 将于 2025 年 2 月发布。

语言改进

Go 1.24 现在全面支持 泛型类型别名:类型别名可以像定义类型一样被参数化。详情请参阅语言规范。目前,可通过设置 GOEXPERIMENT=noaliastypeparams 来禁用该功能,但此选项将在 Go 1.25 中被移除。

工具更新

Go 命令

可执行工具依赖管理

Go 模块现在可以通过 go.mod 文件中的 tool 指令管理可执行工具依赖项,无需再通过在 tools.go 文件中使用空导入的方式作为替代方案。

go tool 命令现在可以运行这些工具,以及 Go 发行版中包含的工具。详情请参阅相关文档。

• go get-tool 标志

使用 -tool 标志可以将工具指令添加到当前模块,同时也会添加 require 指令。

• tool 通配符模式

使用新模式 tool,可以方便地更新或安装所有工具。例如:

• go get -u tool 更新所有工具。

• go install tool 将工具安装到 GOBIN 目录。

缓存改进

通过 go run 生成的可执行文件,以及 go tool 新行为生成的可执行文件,现在会被缓存到 Go 构建缓存中。此改进提高了重复执行的速度,但会增加缓存大小。

JSON 格式的构建输出

go build 和 go install 命令新增 -json 标志,可将构建输出和错误以结构化 JSON 输出到标准输出。详见 go help buildjson。

私有模块认证

新增环境变量 GOAUTH,为私有模块的获取提供灵活的认证方式。详情请参阅 go help goauth。

二进制版本信息

go build 命令会根据版本控制系统的标签和提交信息,在编译后的二进制文件中设置主模块的版本信息。如果代码有未提交的更改,会附加 +dirty 后缀。使用 -buildvcs=false 可禁用版本控制信息。

工具链选择跟踪

新增 GODEBUG 设置项 toolchaintrace=1,可跟踪 go 命令的工具链选择过程。

Cgo

• 支持新的注释以优化 C 函数运行性能:

• #cgo noescape cFunctionName 表示传递到 cFunctionName 的内存不会逃逸。

• #cgo nocallback cFunctionName 表示 cFunctionName 不会回调任何 Go 函数。

• 检测改进:如果 C 函数在多个文件中有不兼容的声明(例如同时声明为 void f(int) 和 void f(double)),Cgo 会报告错误。

Objdump

objdump 工具现在支持以下平台的反汇编:

• 64 位 LoongArch (GOARCH=loong64)

• RISC-V (GOARCH=riscv64)

• S390X (GOARCH=s390x)

Vet 工具

新功能:测试分析器

报告测试、模糊测试、基准测试和示例中的常见错误,如名称不规范或签名不正确。

格式化字符串分析改进

对 fmt.Printf(s)(s 是非常量的格式字符串,且没有其他参数)的调用报告诊断。这类调用可能会错误处理 % 符号,建议使用 fmt.Print。

构建标记分析改进

如果 //go:build 中包含无效的 Go 主版本约束(如 go1.23.1),会报告诊断错误。

运行时改进

性能改进

多项优化使运行时的 CPU 开销平均减少了 2%-3%。主要改进包括:

• 新的内建 map 实现(基于 Swiss Tables)。

• 小对象的内存分配效率提升。

• 新的内部互斥锁实现。

新功能:AddCleanup

提供一种更灵活、更安全的清理机制,可为对象附加清理函数。当对象不再可达时,运行时会自动调用该清理函数。

标准库更新

受限文件系统访问

新增 os.Root 类型,用于在特定目录中执行文件系统操作,且不会允许路径访问目录外的内容。

新增 testing.B.Loop 方法

基准测试可使用 testing.B.Loop 方法简化迭代过程,避免传统的 b.N 循环结构。

新增密码学包

• crypto/hkdf:实现基于 HMAC 的密钥派生函数 HKDF。

• crypto/pbkdf2:实现基于密码的密钥派生函数 PBKDF2。

• crypto/sha3:实现 SHA-3 哈希函数及其扩展函数 SHAKE 和 cSHAKE。

新增实验包:testing/synctest

• 支持并发代码的测试。

• 提供“伪时间”功能以模拟时间行为。

此包为实验性功能,需通过设置 GOEXPERIMENT=synctest 启用,API 可能会在未来版本中更改。