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 fixgo 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/docgo 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.Mutexsync.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
  • moduledatacutab 切片长度修复(此前为实际长度的四倍)
  • .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 位向量类型(如 Int8x16Float64x8)及对应运算(如 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 堆的应用内存占用显著降低。

相关推荐
汀、人工智能10 小时前
[特殊字符] 第21课:最长有效括号
数据结构·算法·数据库架构·图论·bfs·最长有效括号
Boop_wu10 小时前
[Java 算法] 字符串
linux·运维·服务器·数据结构·算法·leetcode
故事和你9111 小时前
洛谷-算法1-2-排序2
开发语言·数据结构·c++·算法·动态规划·图论
Fcy64811 小时前
算法基础详解(三)前缀和与差分算法
算法·前缀和·差分
kvo7f2JTy11 小时前
基于机器学习算法的web入侵检测系统设计与实现
前端·算法·机器学习
List<String> error_P12 小时前
蓝桥杯最后几天冲刺:暴力大法(一)
算法·职场和发展·蓝桥杯
流云鹤13 小时前
Codeforces Round 1090 (Div. 4)
c++·算法
wljy113 小时前
第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯·stl
清空mega14 小时前
C++中关于数学的一些语法回忆(2)
开发语言·c++·算法