文章摘要
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.mod或go.work文件时,不再添加指定当前版本的工具链行。 - Vet命令:新增
waitgroup和hostport分析器,分别用于检测sync.WaitGroup.Add的误用和IPv6地址构造问题。
运行时改进
- 容器感知的
GOMAXPROCS:在Linux上,运行时将考虑包含进程的cgroup的CPU带宽限制。如果CPU带宽限制低于可用逻辑CPU数量,GOMAXPROCS将默认设置为较低的限制。此外,运行时会在逻辑CPU数量或cgroup CPU带宽限制变化时定期更新GOMAXPROCS。 - 新的实验性垃圾收集器:新的垃圾收集器通过更好的局部性和CPU可扩展性提高了小对象的标记和扫描性能,预计在重度使用垃圾收集器的程序中,垃圾收集开销将减少10-40%。
- 跟踪飞行记录器:新增
runtime/trace.FlightRecorderAPI,提供了一种轻量级的方式来捕获运行时执行跟踪。 - 未处理panic输出的变化:当程序因未处理的panic退出时,输出的消息不再重复panic值的文本。
编译器改进
- nil指针bug修复:修复了Go 1.21中引入的编译器bug,该bug可能导致nil指针检查被错误地延迟。
- DWARF5支持:编译器和链接器现在使用DWARF版本5生成调试信息,减少了调试信息所需的空间,并缩短了链接时间。
- 更快的切片:编译器现在可以在更多情况下将切片的底层存储分配在栈上,从而提高了性能。
标准库改进
- 新的
testing/synctest包:提供了对并发代码测试的支持。 - 新的实验性
encoding/json/v2包:新的JSON实现,性能显著提升,尤其是在解码方面。 - 其他库的改进:包括对
archive/tar、crypto、crypto/ecdsa、crypto/ed25519、crypto/rsa、crypto/sha1、crypto/sha3、crypto/tls、crypto/x509、debug/elf、go/ast、go/parser、go/token、go/types、hash、hash/maphash、io/fs、log/slog、mime/multipart、net、net/http、os、reflect、regexp/syntax、runtime、runtime/pprof、sync、testing、testing/fstest、unicode和unique包的改进。
平台支持
- 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和评论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)
语言发展与使用体验:评论3表达了对Go语言持续发展的赞赏,尽管有同事对其某些方面不满,但作者认为Go的简洁性和编译器支持使其成为高效开发的良好选择。
- "I just love how this language marches forward... I sit here combining Go, Goa and SQLc writing mountains of code" (评论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/v2package... brings perf improvements and finally allows devs to implement custom marshalers for external types" (评论5)