
本文已同步发布到微信公众号「人言兑」
👈 扫描二维码关注,第一时间获取更新!
Go 团队于 2026 年 2 月 10 日正式发布了 Go 1.26。这一版本在保持 Go 1 兼容性承诺的基础上,带来了多项重量级更新:从语言语法的灵活性增强,到“绿茶(Green Tea)”垃圾回收器的正式启用,再到标准库的性能飞跃,Go 1.26 无疑将进一步提升开发者的生产力。
以下是 Go 1.26 核心更新内容的详细解读。
new 函数支持表达式初始化此前,new 函数只能接受类型作为参数。在 Go 1.26 中,new 函数的操作数现在可以是一个表达式,用于直接指定变量的初始值。
这对于处理 JSON 或 Protobuf 等包含“可选字段指针”的场景非常方便。
代码示例:
import "encoding/json"
type Person struct {
Name string `json:"name"`
Age *int `json:"age"` // 指针表示可选值
}
func personJSON(name string, years int) ([]byte, error) {
// 以前需要先定义临时变量取地址,现在可以直接写:
return json.Marshal(Person{
Name: name,
Age: new(years),
})
}
通过这种方式,可以在简单的表达式中直接填充可选字段。
Go 1.26 允许泛型类型在自身的类型参数列表中引用自己。这意味着你可以指定一个类型约束,要求该类型本身必须满足某种结构。
代码示例:
// 泛型接口 Adder 要求实现它的类型 A 必须包含一个接收 A 并返回 A 的 Add 方法
type Adder[A Adder[A]] interface {
Add(A) A
}
func algo[A Adder[A]](x, y A) A {
return x.Add(y)
}
这种改变增强了类型约束的表达能力,并微调了语言规范中的类型参数规则。
go fix 与 Modernizersgo fix 命令经过了彻底重构,现在成为了 Go 代码 “现代化(Modernizers)” 的中心。它基于 go vet 分析框架,提供了一系列“一键式”修复工具,帮助开发者将旧代码库更新为最新的习惯用法和标准库 API。
go fix ./... 即可应用数十种现代特性修复。终于不用自己手动改了!//go:fix inline 指令,开发者可以自动化自己的 API 迁移过程。运行fix后将自动更新目录内全部代码的各种老版本写法:
go mod init 版本号策略调整为了鼓励向后兼容性,go mod init 现在默认指定较低的 Go 版本。
go 1.25.0。go 1.24.0。pprof 默认火焰图现在,通过 go tool pprof -http 启动的 Web 界面将默认显示火焰图(Flame Graph),而原来的图形视图移到了菜单中的“View -> Graph”。
在 Go 1.25 作为实验特性后,Green Tea GC 现在正式成为默认配置。
GOEXPERIMENT=nogreenteagc(预计 Go 1.27 将移除此开关)。Go 1.26 引入了一种新的 Profile 类型:goroutineleak,用于检测被永久阻塞的 Goroutine(如死锁、永远无法读取的 Channel 等)。
GOEXPERIMENT=goroutineleakprofile。/debug/pprof/goroutineleak 接口查看。在 Go 1.26 的更新中,标准库迎来了大量增强,涵盖了从网络通信、安全性到性能优化和开发调试的各个方面。
net/http/httputil:ReverseProxy 的安全性升级为了解决 Director 钩子函数在修改请求头时存在的潜在安全风险(恶意客户端可能利用 hop-by-hop 机制移除 Director 添加的头信息),Go 1.26 正式 废弃了 ReverseProxy.Director,并推荐使用在 Go 1.20 引入的 Rewrite 钩子。
proxy := &httputil.ReverseProxy{
// 废弃方式:Director
// Director: func(req *http.Request) { ... },
// 推荐方式:Rewrite
Rewrite: func(r *httputil.ProxyRequest) {
r.SetURL(targetURL) // 安全地设置目标 URL
r.Out.Header.Set("X-Proxy-By", "Go-1.26") // 安全地添加头信息
},
}
net/http:更精细的连接与 Cookie 管理Transport 新增了 NewClientConn 方法,允许开发者获取单个 HTTP 客户端连接。这对于需要手动管理连接池或特殊调度逻辑的高级用户非常有用。Request.Host(如果可用)来匹配 Cookie 作用域,而不再仅仅依赖连接地址的 Host,这更符合实际的网络访问习惯。HTTP2Config 新增 StrictMaxConcurrentRequests 字段,用于控制当连接达到流上限时是否强制开启新连接。net/url:更严格的 URL 解析url.Parse 现在会拒绝 Host 部分包含非法冒号的 URL(例如 http://localhost:80:80/)。如果现有的旧代码依赖这种非标准行为,可以通过设置环境变量 GODEBUG=urlstrictcolons=0 临时恢复。
在 crypto/rsa、crypto/ecdsa、crypto/ecdh、crypto/dsa 和 crypto/rand 等包中,许多函数的 random 参数(即 io.Reader 类型的随机源)现在被忽略了。
testing/cryptotest 中的 SetGlobalRandom 函数,而不是手动传入伪随机数生成器。crypto/tls 现在默认启用了混合后量子密钥交换算法:SecP256r1MLKEM768 和 SecP384r1MLKEM1024。这标志着 Go 在应对未来量子计算威胁方面走在了前列。
新增 crypto/fips140 包,支持在 GODEBUG=fips140=only 模式下运行,并提供了 WithoutEnforcement 和 Enforced 函数来灵活调整 FIPS 140-3 的合规性检查。
io.ReadAll:内存减负io.ReadAll 进行了重构,减少了中间内存的分配,并确保最终返回的 slice 大小是精确匹配的。
fmt.Errorf:无格式化时的零额外开销对于不包含格式化占位符的字符串(如 fmt.Errorf("an error occurred")),其分配性能现在已经与直接调用 errors.New 完全一致。
image/jpeg:全新的编解码实现JPEG 编解码器被完全替换为更快速、更精确的实现。需要注意的是,由于算法精度提升,输出的二进制数据可能与旧版本略有不同(不是 bit-for-bit 相同)。
log/slog:多处理器支持新增 NewMultiHandler 函数,可以将日志同时发送给多个 Handler(例如同时输出到控制台和文件)。
handler := slog.NewMultiHandler(consoleHandler, fileHandler)
logger := slog.New(handler)
testing:测试产物自动化管理新增 T.ArtifactDir、B.ArtifactDir 和 F.ArtifactDir 方法,返回一个专门用于存放测试输出文件(如生成的图片、日志等)的目录。
go test -artifacts 时,这些文件会被保存在指定路径;否则它们存放在临时目录并在测试结束后自动清理。runtime/metrics:更深入的调度器监控新增了多项关于调度器的指标,包括:
/sched/goroutines:处于不同状态(等待、可运行等)的协程计数。/sched/threads:threads:运行时感知的操作系统线程数。/sched/goroutines-created:goroutines:程序创建的协程总数。bytes:Buffer 新增 Peek(n) 方法,允许在不移动读取指针的情况下查看后续 n 个字节。os:Process 新增 WithHandle,在 Linux(pidfd)和 Windows 上提供对内部进程句柄的访问。os/signal:NotifyContext 现在会通过 context.CancelCauseFunc 记录触发取消的具体信号错误,方便追踪。net/netip:Prefix 新增 Compare 方法,方便对网络前缀进行排序和比较。windows/arm 端口。Go 1.26 是一个稳健且充满诚意的版本,这些改进使得 Go 在构建高性能、高安全性的企业级应用时更具优势。
想要立刻尝试新特性?只需运行:
go install golang.org/dl/go1.26.0@latestgo1.26.0 downloadgo1.26.0 version
欢迎在评论区分享Go 1.26的哪一个新特性对你最有帮助? 对我而言,go fix首当其冲,现在看老代码各种新语法Lint提示看的太难受了,现在一键修复!当然 io.ReadAll和GC性能更新也是非常有用!快去升级!