Go 1.26 发布:new(expr)、泛型自引用落地,Green Tea GC 默认开启
Go 1.26 于 2026-02-10 发布,距 Go 1.25 六个月。Go 1 兼容性承诺仍然保持,几乎所有程序可以照常编译运行。
- 发布说明:go.dev/doc/go1.26
- 官方博客:go.dev/blog/go1.26
- 交互式解读:antonz.org/go-1-26
语言变化
new 接受表达式
内建 new 函数现在允许操作数是一个表达式,用来指定变量的初始值。
以前要拿到一个指向 300 的 *int64,需要两步:
x := int64(300)
ptr := &x
现在可以写成:
ptr := new(int64(300))
泛型类型可在类型参数列表中引用自身
泛型类型现在可以在自己的类型参数列表里引用自身,也就是递归类型约束。此前泛型类型不得在类型参数列表中引用自身。这类约束让复杂数据结构和接口的实现更简单,例如泛型类型 Adder 可以要求用「像自己一样」的类型来实例化。
运行时与性能
- Green Tea 垃圾回收器默认启用。它在 Go 1.25 中作为实验特性提供,面向现代多核机器改善内存局部性,对分配密集的程序可降低 10%–40% 的 GC 开销;在新款 AMD/Intel(Zen 4+、Ice Lake+)上借助向量指令扫描对象,还能再提升约 10%。想回到旧 GC,可在构建时设置
GOEXPERIMENT=nogreenteagc,该选项预计在 Go 1.27 移除。 - cgo 基线开销降低约 30%。
- 编译器在更多情况下能把 slice 的底层存储分配到栈上,提升性能。若该优化引发问题,可用 bisect 工具定位,并可用构建标志关闭。
- 64 位平台加入堆基址随机化,增加内存地址预测难度,配合 cgo 做安全加固。
- 新增
sizespecializedmalloc优化,提供更快的分配路径,可用GOEXPERIMENT=nosizespecializedmalloc关闭,预计 Go 1.27 移除。
工具链
go fix 重写为 modernizers 集合
go fix 命令被完全重写,改用 Go 分析框架,成为一组「modernizers」:包含数十个 fixer,可以安全地把代码库更新到更现代的语法与标准库 API;另有源码级 inliner,通过 //go:fix inline 指令自动化你自己的 API 迁移。这些 fixer 不应改变程序行为。
go mod init 写入更低的 go 版本
go mod init 现在为新 go.mod 写入更低的 go 版本:用 1.N.X 工具链运行会生成 go 1.(N-1).0;预发布版 1.N 会生成 go 1.(N-2).0。例如 Go 1.26 及其小版本生成的 go.mod 是 go 1.25.0,鼓励模块兼容当前受支持的 Go 版本。需要更细控制可以用 go get go@version。
其他
- pprof 的 Web UI(
-http启动)现在默认显示火焰图;旧的 graph 视图在 View -> Graph 菜单或/ui/graph。 - 内部命令
go tool doc弃用,go doc保留且功能相同。
新增包
crypto/hpke:混合公钥加密,RFC 9180,含后量子混合 KEM 支持crypto/mlkem/mlkemtesttesting/cryptotest
实验特性
以下都需要显式打开 GOEXPERIMENT:
simd/archsimd(GOEXPERIMENT=simd):架构相关的 SIMD 操作,目前仅支持 amd64,支持 128/256/512 位向量类型(如Int8x16、Float64x8),API 尚未稳定。runtime/secret(GOEXPERIMENT=runtimesecret):安全擦除处理机密信息(通常是密码学用途)的临时数据——寄存器、栈、新堆分配。目前支持 Linux 上的 amd64 与 arm64,有助于前向保密。- goroutineleak profile(
GOEXPERIMENT=goroutineleakprofile):runtime/pprof新增报告泄漏 goroutine 的 profile。判断逻辑是:某 goroutine 阻塞在并发原语上,而该原语从任何可运行 goroutine 都不可达,则判定为泄漏。若使用net/http/pprof,还会暴露/debug/pprof/goroutineleak端点。团队计划在 Go 1.27 默认启用。
标准库改进
- Reader-less cryptography:多数 crypto API 去掉
Reader参数,始终使用系统随机源;为支持确定性测试,新增testing/cryptotest包的SetGlobalRandom,可在测试期间设置全局确定性随机源。 fmt.Errorf:对无格式字符串的分配减少,基本与errors.New持平。io.ReadAll:最多快 2 倍,分配减少约 50%。bytes.Buffer.Peek:不推进读指针即可窥视缓冲内容。log/slog新增NewMultiHandler,一次把日志派发到多个目标,无需自定义适配器。reflect新增迭代器:Type.Fields、Type.Methods、Type.Ins、Type.Outs,以及Value.Fields等。- 网络:context-aware 拨号方法
DialTCP/DialUDP/DialIP/DialUnix;net新增Prefix.Compare,便于排序比较 IP 前缀。 Process.WithHandle;信号作为 cause;基准测试全面转向B.Loop风格。
平台
macOS 12 弃用,Go 1.27 将要求 macOS 13 Ventura 或更新。