Go 1.26

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.module
  • moduledata 的 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 堆的应用内存占用显著降低。

相关推荐
aqiu1111111 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
信奥卷王9 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵9 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG11 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z11 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛12 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记12 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序12 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室12 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法