Hacker News 中文摘要

RSS订阅

Go 1.25 发布说明 -- Go 1.25 Release Notes

文章摘要

Go 1.25于2025年8月发布,主要更新集中在工具链、运行时和库的实现上,保持了Go 1的兼容性承诺,确保现有程序能继续编译和运行。语言层面无影响程序的变化,但语言规范中移除了核心类型概念。工具方面,go build-asan选项默认在程序退出时进行内存泄漏检测,报告未释放的C内存错误,可通过设置ASAN_OPTIONS=detect_leaks=0禁用。

文章总结

Go 1.25 版本于2025年8月发布,距离Go 1.24发布已有六个月。该版本主要对工具链、运行时和库的实现进行了改进,同时保持了Go 1的兼容性承诺,确保绝大多数Go程序能够继续正常编译和运行。

语言变化

Go 1.25 没有引入影响现有程序的语言变化,但在语言规范中移除了“核心类型”的概念,转而使用更详细的描述。

工具改进

  • Go命令go build -asan 选项现在默认在程序退出时进行内存泄漏检测。如果C分配的内存未被释放且未被其他C或Go内存引用,将报告错误。可以通过设置 ASAN_OPTIONS=detect_leaks=0 来禁用这些错误报告。
  • Go命令:Go发行版将减少预构建的工具二进制文件,核心工具链如编译器和链接器仍会包含,但非构建或测试操作调用的工具将由 go tool 按需构建和运行。
  • Go命令:新增 go.mod ignore 指令,用于指定 go 命令应忽略的目录。
  • Go命令:新增 go doc -http 选项,启动文档服务器并打开浏览器窗口显示请求对象的文档。
  • Go命令:新增 go version -m -json 选项,打印嵌入在Go二进制文件中的 runtime/debug.BuildInfo 结构的JSON编码。
  • Go命令:支持使用仓库的子目录作为模块根路径。
  • Go命令go 命令在更新 go.modgo.work 文件时,不再添加指定当前版本的工具链行。
  • Vet命令:新增 waitgrouphostport 分析器,分别用于检测 sync.WaitGroup.Add 的误用和IPv6地址构造问题。

运行时改进

  • 容器感知的 GOMAXPROCS:在Linux上,运行时将考虑包含进程的cgroup的CPU带宽限制。如果CPU带宽限制低于可用逻辑CPU数量,GOMAXPROCS 将默认设置为较低的限制。此外,运行时会在逻辑CPU数量或cgroup CPU带宽限制变化时定期更新 GOMAXPROCS
  • 新的实验性垃圾收集器:新的垃圾收集器通过更好的局部性和CPU可扩展性提高了小对象的标记和扫描性能,预计在重度使用垃圾收集器的程序中,垃圾收集开销将减少10-40%。
  • 跟踪飞行记录器:新增 runtime/trace.FlightRecorder API,提供了一种轻量级的方式来捕获运行时执行跟踪。
  • 未处理panic输出的变化:当程序因未处理的panic退出时,输出的消息不再重复panic值的文本。

编译器改进

  • nil指针bug修复:修复了Go 1.21中引入的编译器bug,该bug可能导致nil指针检查被错误地延迟。
  • DWARF5支持:编译器和链接器现在使用DWARF版本5生成调试信息,减少了调试信息所需的空间,并缩短了链接时间。
  • 更快的切片:编译器现在可以在更多情况下将切片的底层存储分配在栈上,从而提高了性能。

标准库改进

  • 新的 testing/synctest:提供了对并发代码测试的支持。
  • 新的实验性 encoding/json/v2:新的JSON实现,性能显著提升,尤其是在解码方面。
  • 其他库的改进:包括对 archive/tarcryptocrypto/ecdsacrypto/ed25519crypto/rsacrypto/sha1crypto/sha3crypto/tlscrypto/x509debug/elfgo/astgo/parsergo/tokengo/typeshashhash/maphashio/fslog/slogmime/multipartnetnet/httposreflectregexp/syntaxruntimeruntime/pprofsynctestingtesting/fstestunicodeunique 包的改进。

平台支持

  • Darwin:Go 1.25 要求 macOS 12 Monterey 或更高版本,不再支持之前的版本。
  • Windows:Go 1.25 是最后一个包含32位 windows/arm 端口的版本,该端口将在Go 1.26中移除。
  • Loong64:linux/loong64 端口现在支持竞态检测器,并支持从C代码中收集回溯信息。
  • RISC-V:linux/riscv64 端口现在支持 plugin 构建模式,并新增了 rva23u64 用户模式应用配置文件。

Go 1.25 通过多项改进和修复,进一步提升了开发体验和性能,开发者可以尝试新特性并提供反馈。

评论总结

  1. 新版本发布:评论1和评论2提到Go 1.25版本已发布,虽然更新内容不算特别激动人心,但期待jsonv2和greentea在1.26版本中成为标准。

    • "1.25 tag was released" (评论1)
    • "Yay new version! Not the most exciting... but hopefully jsonv2 and greentea can get some testing and be standard in 1.26" (评论2)
  2. 语言发展与使用体验:评论3表达了对Go语言持续发展的赞赏,尽管有同事对其某些方面不满,但作者认为Go的简洁性和编译器支持使其成为高效开发的良好选择。

    • "I just love how this language marches forward... I sit here combining Go, Goa and SQLc writing mountains of code" (评论3)
  3. 技术细节与改进:评论4和评论5分别讨论了LookupMX函数的改进和新引入的encoding/json/v2包。评论4对DNS记录返回IP地址的现象表示好奇,评论5则对jsonv2的性能提升和自定义序列化功能表示赞赏。

    • "LookupMX and Resolver.LookupMX now return DNS names that look like valid IP address" (评论4)
    • "New encoding/json/v2 package... brings perf improvements and finally allows devs to implement custom marshalers for external types" (评论5)