编程 Go 1.26 发布:new(expr)、泛型自引用落地,Green Tea GC 默认开启

2026-10-02 21:03:49

Go 1.26 发布:new(expr)、泛型自引用落地,Green Tea GC 默认开启

Go 1.26 于 2026-02-10 发布,距 Go 1.25 六个月。Go 1 兼容性承诺仍然保持,几乎所有程序可以照常编译运行。

语言变化

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/mlkemtest
  • testing/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 或更新。

复制全文 生成海报 Go 编程语言 性能优化 工具链 标准库

推荐文章

程序员茄子在线接单