Go 1.28 提案:freegc、M-local storage、SIMD 与 Wasm 栈切换的进度
来源:TonyBai《Go 1.28 Roadmap Revealed》(2026-07-16,besthub.dev),内容基于 Go 编译器与 runtime 的会议纪要(issues #43930、#74299、#38917、#73787、#60630 等),以及 Go Weekly #612。
Go 1.27 的代码树在 7 月中旬重新开放,1.28 周期随之启动。性能面板做了三项调整:重新评估 linker 的 randlayout 选项(随机内存布局能暴露隐藏的性能差异,但也会放大 benchmark 噪声);刷新 benchmark 套件(更新旧模块版本,增加覆盖近期语言与库特性的测试);面板 UI 可能有改进。
编译器插入 runtime.free:freegc 实验(#74299)
golang/go#74299 增加了 runtime.freegc 实验:当编译器能证明某个对象之后不会再被使用时,就插入 runtime.free 调用。有一个大小阈值用来平衡调用开销与 GC 收益,默认 16 字节;团队正在考虑让它与 Go 1.25 引入的栈分配阈值对齐。
sync 的分片计数:M-local storage(#73667)
分片计数器针对的是高并发下的 cache line 争用。新的 sync 原语 “M-local storage”(golang/go#73667)提供原生的 per-thread 分片,相比 VictoriaMetrics 等项目里临时搭的分片方案扩展性更好。
SIMD(#73787、#78902)
GOEXPERIMENT=simd 引入 archsimd 包里的架构相关 intrinsics(golang/go#73787)。AMD64 自 Go 1.26 起支持,Go 1.27 RC1 增加了 Wasm 与 ARM64。在其上正在构建实验性的可移植 simd 包(golang/go#78902)。后续工作包括 ARM64 的 scalable vector extensions(SVE)。
Wasm stack switching(#65440)
当前 Go 的 Wasm 代码用一个大 switch / br_table 构造来模拟任意控制流,性能约为原生的 20%(golang/go#65440)。团队在跟踪 WebAssembly stack-switching 提案;若被采用,Go 可以用真正的栈切换替代 switch 表 hack,大幅提升 Wasm 性能。
结构化 struct tag(#74472、#23637)
golang/go#74472 与 #23637 提议把自由格式的字符串 tag 变成括号内的常量表达式列表,从而在编译期校验 tag 的键和值。提案目前处于搁置状态,但出现在 1.28 议程里。
类型推断复合字面量(#12854)
提案 golang/go#12854 于 2015 年提交,希望把当前只在 slice/array/map 字面量里允许省略类型的规则,扩展到所有能推断类型的上下文,例如函数实参与变量初始化。对于 protobuf 生成的结构体这类长类型名,能减少样板代码。
无 C 工具链的 Cgo(#38917、#69639)
golang/go#38917 与 #69639 探索预编译 Cgo 产物、用 -linkmode=internal 避免交叉编译时需要本地 C 编译器或链接器。若成功,将简化 macOS/iOS 与 Android 构建的 Cgo 包分发。
泛型容器(#47963、#47331、#60630、#53196)
有多个 issue 在讨论把有序 map/set 等泛型容器加进标准库,这反映了 1.18 引入泛型后的社区需求。1.28 路线图把 “generic containers” 重新列为候选,最终决定仍未定。
拆分编译器导出数据、重构泛型实例化导出(#56718、#70511、#79592)
两个长期痛点:跨包泛型实例化的重复编译过多(golang/go#56718、#70511);跨包泛型实例化缺少逃逸分析数据(golang/go#79592)。两者都源于 cmd/compile 与外部工具(gopls、go/packages)共享的 Unified IR 导出格式。把导出格式重构得更细粒度、惰性加载可以缓解。
GC 可扩展性瓶颈(#73581)
Green Tea 收集器(golang/go#73581)从逐对象扫描转向按块扫描,改善缓存局部性。它在 Go 1.25 以实验形式引入后,团队继续寻找高并发负载下剩余的扩展性限制。
状态
1.28 的候选特性大致分三类:语言与标准库的人体工学改进(类型推断字面量、结构化 tag、泛型容器);面向高吞吐与新平台的原生性能扩展(SIMD、Wasm 栈切换、无 C 工具链的 Cgo);编译器与运行时扩展性工作(分片计数器、导出数据重构、GC 扩展性、runtime.free)。所有项目仍是提案,最终是否纳入要等 1.28 feature freeze 确认。