Go 1.26 版本介绍
Go 最新版本 1.26 于 2026 年 2 月发布,更新的大部分改动集中在工具链、运行时与标准库的实现层面。
语言变更
内置的 new 函数用于创建新变量,现在允许其参数为表达式,用于指定变量的初始值。
该特性在搭配 encoding/json、Protocol Buffers 这类用指针表示可选值的序列化库时尤为实用,可以用简洁表达式为可选字段赋值,示例:
import "encoding/json"
type Person struct {
Name string `json:"name"`
Age *int `json:"age"` // 已知年龄则有值,否则为 nil
}
func personJSON(name string, born time.Time) ([]byte, error) {
return json.Marshal(Person{
Name: name,
Age: new(yearsSince(born)),
})
}
func yearsSince(t time.Time) int {
return int(time.Since(t).Hours() / (365.25 * 24)) // 近似计算
}
泛型类型不能在自身类型参数列表中引用自身 的限制已被移除。现在可以定义引用自身的类型约束,例如泛型类型 Adder 可要求实例化类型与自身一致:
type Adder[A Adder[A]] interface {
Add(A) A
}
func algo[A Adder[A]](x, y A) A {
return x.Add(y)
}
此前第一行中对 Adder 的自引用是不被允许的。该改动不仅增强了类型约束的能力,也略微简化了类型参数的规范规则。
工具
Go 命令
经典的 go fix 命令已完全重构 ,成为 Go 现代化工具的核心。它提供一键式可靠方案,将 Go 代码库升级到最新惯用写法与核心库 API。首批现代化工具包含数十个修复器,用于适配 Go 语言与库的现代特性;同时内置源码级内联工具,支持通过 //go:fix inline 指令自动化完成自定义 API 迁移。这些修复器不会改变程序行为 ,若使用 go fix 后出现问题,欢迎提交反馈。
重写后的 go fix 与 go vet 基于完全相同的 Go 分析框架构建,意味着 go vet 中提供诊断的分析器,均可在 go fix 中用于自动修复建议。go fix 中已废弃的历史修复规则已全部移除。后续将发布两篇 Go 官方博客,详细介绍现代化工具、内联功能及 go fix 的高效使用方法。
go mod init 新建 go.mod 时默认使用更低的 Go 版本:
- 版本为
1.N.X的工具链执行go mod init,会指定 Go 版本为1.(N-1).0 1.N预发布版本则会指定1.(N-2).0
例如:Go 1.26 候选版生成 go 1.24.0,Go 1.26 正式版及小版本生成 go 1.25.0。此举旨在鼓励创建与当前受支持 Go 版本兼容的模块。如需精确指定版本,可在 go mod init 后执行 go get go@版本号。
cmd/doc 与 go tool doc 已被移除,可直接使用 go doc 替代,参数、标记与行为完全一致。
Pprof
通过 -http 启用的 pprof Web UI,默认视图改为火焰图 。原有的图形视图可在「View -> Graph」菜单或 /ui/graph 路径访问。
运行时
全新垃圾回收器
Go 1.25 中作为实验特性的Green Tea垃圾回收器 ,在吸收反馈后现已默认启用。
该 GC 设计通过更好的局部性与 CPU 可扩展性,提升了小对象标记与扫描性能。基准测试结果各异,但在重度依赖 GC 的真实程序中,GC 开销预计可降低 10%--40%。在新一代 amd64 平台(Intel Ice Lake、AMD Zen 4 及更新型号)上,GC 会尽可能使用向量指令扫描小对象,可再降低约 10% 的 GC 开销。
可在编译时设置 GOEXPERIMENT=nogreenteagc 禁用新 GC,该退出选项预计在 Go 1.27 中移除。若因性能或行为问题禁用新 GC,请提交 Issue 反馈。
cgo 调用更快
cgo 调用的基础运行时开销降低约 30%。
堆基址随机化
64 位平台上,运行时会在启动时随机化堆基址 ,提升安全性,增加攻击者利用 cgo 漏洞预测内存地址的难度。可在编译时设置 GOEXPERIMENT=norandomizedheapbase64 关闭该特性,该退出选项将在未来版本中移除。
实验性 Goroutine 泄漏分析
新增实验性 Goroutine 泄漏分析剖面 ,在 runtime/pprof 中名为 goroutineleak,可通过编译时设置 GOEXPERIMENT=goroutineleakprofile 启用。启用后会在 net/http/pprof 提供 /debug/pprof/goroutineleak 端点。
泄漏 Goroutine 指阻塞在同步原语(通道、sync.Mutex、sync.Cond 等)上且永远无法被唤醒的 Goroutine。运行时通过 GC 判定泄漏:若 Goroutine G 阻塞在同步原语 P 上,且 P 无法被任何可运行 Goroutine 或其可唤醒的 Goroutine 访问,则 G 永久阻塞。该方法可检测大部分常见泄漏,无法覆盖所有场景。
示例(可被该剖面检测到的真实泄漏):
go
运行
type result struct {
res workResult
err error
}
func processWorkItems(ws []workItem) ([]workResult, error) {
ch := make(chan result)
for _, w := range ws {
go func() {
res, err := processWorkItem(w)
ch <- result{res, err}
}()
}
var results []workResult
for range len(ws) {
r := <-ch
if r.err != nil {
// 提前返回会导致 Goroutine 泄漏
return nil, r.err
}
results = append(results, r.res)
}
return results, nil
}
通道无缓冲,出错提前返回后,剩余 Goroutine 会阻塞泄漏;通道随后不可达,运行时可检测并上报。
该实现已达生产可用级别,仅作为实验特性收集 API 反馈,不使用时无额外运行时开销。鼓励在 Playground、测试、CI 与生产环境试用,计划在 Go 1.27 中默认启用。
特别感谢 Uber 的 Vlad Saioc 贡献该功能,相关理论已发表论文。
编译器
编译器可在更多场景下将切片底层存储分配到栈上 ,提升性能。若该优化引发问题,可使用 -compile=variablemake 定位问题分配,或通过 -gcflags=all=-d=variablemakehash=n 全局关闭该优化。出现异常请提交 Issue。
链接器
64 位 ARM Windows(windows/arm64)平台,链接器现已支持 cgo 程序内部链接模式 ,可通过 -ldflags=-linkmode=internal 启用。
可执行文件有若干细微调整,不影响程序运行,但可能影响分析 Go 可执行文件的工具与自定义链接脚本:
moduledata结构移入独立段.go.modulemoduledata的cutab切片长度修复(此前为实际长度的四倍).gopclntab段起始的pcHeader不再记录文本段起始地址,该字段恒为 0.gopclntab段无重定位,支持 relro 的平台从 relro 段移至 rodata 段funcdata符号与findfunctab从.rodata移入.gopclntab- 移除空段
.gosymtab - 内部链接时,ELF 段按地址排序,不再无序
Darwin 平台段名以双下划线开头且不含点号。
引导编译
Go 1.26 引导编译要求 Go 1.24.6 及以上版本;Go 1.28 预计将要求 Go 1.26 及以上小版本。
标准库
新增 crypto/hpke 包
实现 RFC 9180 定义的混合公钥加密(HPKE),支持后量子混合 KEM。
新增实验性 simd/archsimd 包
Go 1.26 引入实验性 simd/archsimd 包,编译时设置 GOEXPERIMENT=simd 启用,提供架构专属 SIMD 操作 。目前仅支持 amd64,提供 128/256/512 位向量类型(如 Int8x16、Float64x8)及对应运算(如 Int8x16.Add),API 尚未稳定。未来将支持更多架构,并计划开发高层可移植 SIMD 包。
新增实验性 runtime/secret 包
实验性 runtime/secret 包,编译时设置 GOEXPERIMENT=runtimesecret 启用,用于安全擦除密码相关临时数据(寄存器、栈、新堆分配),保障前向保密。目前支持 Linux amd64/arm64。
库次要变更
bytes
新增 Buffer.Peek 方法,返回后续 n 字节但不移动读取指针。
crypto
新增 Encapsulator/Decapsulator 接口,支持抽象 KEM 封装 / 解封装密钥。
crypto/dsa / ecdh / ecdsa / ed25519 / rand / rsa
各加密库中密钥生成、签名等函数的 random 参数已被忽略 ,统一使用安全密码随机源;确定性测试可使用新增 testing/cryptotest.SetGlobalRandom;可通过 GODEBUG=cryptocustomrand=1 临时恢复旧行为。
crypto/rsa
- 新增
EncryptOAEPWithOptions,支持 OAEP 填充与 MGF1 分别指定哈希 - 不安全的 PKCS #1 v1.5 加密填充已废弃
crypto/sha3
SHA3 零值为可用的 SHA3-256 实例,SHAKE 零值为可用的 SHAKE256 实例。
crypto/subtle
WithDataIndependentTiming 执行时不再锁定 OS 线程,衍生 Goroutine 继承该特性;cgo 调用也会继承数据无关时序特性。
crypto/tls
默认启用后量子密钥交换 SecP256r1MLKEM768/SecP384r1MLKEM1024,可通过配置或 GODEBUG=tlssecpmlkem=0 关闭;新增 ClientHelloInfo.HelloRetryRequest 等字段;Go 1.27 将移除一批旧 GODEBUG 设置。
crypto/x509
ExtKeyUsage/KeyUsage 新增 String/OID 方法;新增 OIDFromASN1OID 转换函数。
errors
新增泛型函数 AsType,类型安全、更快且更易用。
fmt
fmt.Errorf("x") 内存分配优化,与 errors.New 开销接近。
go/ast
新增 ParseDirective 解析指令注释;BasicLit.ValueEnd 记录字面量精确结束位置。
image/jpeg
编解码器替换为更快、更精准的新实现,逐比特严格依赖旧实现的代码需适配。
io
ReadAll 内存分配大幅优化,速度提升约一倍,内存占用减半。
log/slog
新增 NewMultiHandler,支持多路日志处理器。
net
Dialer 新增 DialIP/DialTCP 等方法,支持上下文。
net/http
HTTP2Config.StrictMaxConcurrentRequests控制 HTTP/2 流超限行为Transport.NewClientConn直接返回客户端连接ServeMux尾斜杠重定向改为 307 临时重定向
net/http/httputil
ReverseProxy.Director 废弃,改用更安全的 Rewrite。
os/signal
NotifyContext 取消上下文时会携带信号错误原因。
reflect
新增 Type.Fields/Methods 等迭代器方法,简化遍历。
runtime/metrics
新增调度器指标,包括不同状态 Goroutine 计数、OS 线程数等。
testing
新增 ArtifactDir 方法,用于存放测试输出文件;B.Loop 修复内联抑制问题,基准测试可安全迁移到该写法。
time
Go 1.27 将移除 asynctimerchan,定时器统一使用无缓冲同步通道。
平台支持
Darwin
Go 1.26 是最后一个支持 macOS 12 Monterey 的版本,Go 1.27 起要求 macOS 13 Ventura 及以上。
FreeBSD
freebsd/riscv64 端口标记为不可用。
Windows
移除不可用的 32 位 windows/arm 端口。
PowerPC
Go 1.26 是 Linux ppc64 最后支持 ELFv1 ABI 的版本,Go 1.27 切换为 ELFv2。
RISC-V
linux/riscv64 支持竞争检测器。
S390X
支持寄存器传递函数参数与返回值。
WebAssembly
编译器默认使用符号扩展、无陷阱浮点转整数指令,相关 GOWASM 设置失效;堆内存管理粒度更小,小于 16MiB 堆的应用内存占用显著降低。