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 可能会在未来版本中更改。