编程 Go 1.26 的 go fix 被重写:用 modernizers 批量升级旧代码

2026-09-22 21:05:33

Go 1.26 的 go fix 被重写:用 modernizers 批量升级旧代码

Go 1.26 于 2026-02-10 发布。官方发布说明见 go.dev/doc/go1.26,发布博客见 go.dev/blog/go1.26

这个版本里最值得动手试的是 go fix:它被彻底重写,成为 Go 的「现代化(modernizers)」中心。

go fix 现在做什么

新版 go fix 基于与 go vet 相同的 Go analysis framework 实现,提供一键式更新,把旧代码库升级到最新的习惯用法与标准库 API。

  • 内置数十个 modernizers(分析器),在尽量不改变程序行为的前提下建议并应用安全的修复。如果发现问题,应提交 issue。
  • 附带 source-level inliner:对标注了 //go:fix inline 指令的函数,可以把所有调用点内联,从而自动化用户自己的 API 迁移。

也就是说,go fix 不再只是语法修补,它可以对模块/包批量运行分析器并应用修复。

工具链其他变更

go mod init 默认版本更低。1.N.X 工具链执行 go mod init,会生成 go 1.(N-1).0;预发布版会生成 go 1.(N-2).0。例如 Go 1.26 与其小版本生成 go 1.25.0,RC 生成 go 1.24.0。这样做的目的是鼓励模块兼容当前受支持的 Go 版本。可以用 go get go@version 覆盖。

doc 命令收敛。 cmd/docgo tool doc 已删除,改用 go doc

pprof Web UI 默认视图变了。 -http 启动的 Web UI 现在默认展示火焰图视图;旧的图视图在 View -> Graph 菜单,或直接访问 /ui/graph

语言层

内置 new 函数现在允许操作数是表达式,用于指定变量初始值:

ptr := new(int64(300))

替代原来的写法:

x := int64(300)
ptr := &x

泛型类型可在自身类型参数列表中自引用。

性能

  • 默认启用实验了一版的 Green Tea GC,官方预计重度依赖 GC 的真实程序开销降低 10%–40%。
  • cgo 基线开销降低约 30%。
  • 编译器在更多场景把切片底层存储分配到栈上。

新包

标准库新增 crypto/hpkecrypto/mlkem/mlkemtesttesting/cryptotest

实验性内容包括 simd/archsimdruntime/secret,以及 goroutineleak profile,后者需要开启 GOEXPERIMENT

升级前建议先在 CI 或独立分支上跑一遍 go fix,确认 diff 符合预期再合并。

复制全文 生成海报 Go 工具链 代码迁移 语言版本

推荐文章

程序员茄子在线接单