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/doc 与 go 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/hpke、crypto/mlkem/mlkemtest、testing/cryptotest。
实验性内容包括 simd/archsimd、runtime/secret,以及 goroutineleak profile,后者需要开启 GOEXPERIMENT。
升级前建议先在 CI 或独立分支上跑一遍 go fix,确认 diff 符合预期再合并。