惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
V
Visual Studio Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
I
InfoQ
小众软件
小众软件
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy International News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
P
Privacy & Cybersecurity Law Blog
AWS News Blog
AWS News Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security Affairs
Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
Spread Privacy
Spread Privacy
Recent Commits to openclaw:main
Recent Commits to openclaw:main
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
C
CERT Recently Published Vulnerability Notes
IT之家
IT之家
月光博客
月光博客
雷峰网
雷峰网
博客园 - 【当耐特】
Stack Overflow Blog
Stack Overflow Blog
美团技术团队
NISL@THU
NISL@THU
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

鸟窝

鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 LLM 究竟是如何工作的? amd64 微架构级别对 Go 程序性能提升多少? Loop Engineering 实践:一次批量实现 8 个 issue,完成夔牛工具的开发 Loop Engineering 实践:我把 RDMA 开发库移植到 Go 语言,花费 239 块钱 傻瓜式RDMA高性能网络开发:从零跑到 400 Gb每秒 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 百度网络监控工具开源第三弹:lidar — 不只是 pingmesh 别只盯着gopacket了,看看这个强大的网络库 大厂的内部工具居然开源了! 一窥百度物理网络秒级监控定位的秘密 如何构建你自己的 Agent 运行时 寻找你代码中的臭味:一个让 AI 帮你嗅出架构腐化的开源 Skill 套壳不丢人!我用Go+AI搓了一个Agent统一编排框架,ClaudeCode-Codex-Pi全被我包了 告别死锁和陈旧语法、告别性能瓶颈:三个开源 Skill,新手Gopher 秒变 Go 语言大神 SPEC和PRD的区别 SPEC和方案设计有什么区别 从需求到上线,让 AI 管理你的整个研发流程! antigravity-cli 使用 CLIProxyAPI, 让最新的 Codex 能够支持国内的各大模型 Clawpatch + codex-review:AI 代码审查工具链的正确打开方式 拆解Manus:沙盒架构深度解析 40+ Claude Code Tips: From Basics to Advanced Ralph 实验:构建 SQLite UI 了解 Manus Sandbox - 您的云计算机 Notex:一个开源 NotebookLM 替代方案的实现 拆解Manus:真正有用的深度报告的生成 Claude Code 使用 我给每个模型服务商『捐』了10块钱,只为了... Go之禅 - 基于Rob Pike思想的Go语言哲学 Codex CLI vs Gemini CLI vs Claude Code:谁是最佳选择? goskills:Claude Skills 功能强大,为我所用 一行代码使用 Claude Skill 和 deepseek langchain + MCP:如虎添翼 Linux 中网络包的一生 godotenv 库介绍 Codex CLI vs Gemini CLI vs Claude Code: Which is the Best? 使用Linux 30年了,我都不知道 ping 8.8 还能这么用? 从 AI 哪里挣钱? Go sync 包近两年发展综述 deepseek-v3.2-exp的闪电索引器
Go 实验特性详解
smallnest · 2026-06-21 · via 鸟窝

Go 在发布新版本时经常会附带实验性特性(experimental features)

这些实验性特性有不同的形式:有时是标准库中全新的包,有时是编译器或运行时的改动,偶尔也可能是对 Go 行为的破坏性变更。

大多数情况下,实验性特性的目的是在某个功能正式进入 通用可用(general availability) 阶段、成为 Go 的永久组成部分之前,从用户那里获取真实世界的反馈。如果该特性导致性能退化,或收到社区的负面反馈,它可以在最终定稿前被修改——甚至被完全放弃。

一些示例

让我们看几个近期的例子,来说明 Go 实验特性可能涉及的内容类型。

  • Go 1.24 发布时附带了新的 testing/synctest 包的实验性支持(该包提供了测试并发代码的支持)。在收到反馈后,该包的 API 略有调整,并在 Go 1.25 中正式进入通用可用阶段。

  • Go 1.25 发布时附带了新的垃圾回收器设计的实验性支持,具有更好的性能。在吸收反馈之后,新的垃圾回收器在 Go 1.26 中成为默认选项。

  • Go 1.21 发布时附带了循环变量语义行为变更的实验性支持。这一变更消除了 Go 代码中一个以前常见的 bug,但在技术上是对语言的破坏性变更。将该变更作为实验发布,让人们在 Go 1.22 中该行为成为默认之前有机会测试自己的代码。

实验特性的生命周期

实验特性并没有单一固定的生命周期,但有一些常见的模式。

大多数实验特性最初以**默认关闭(off-by-default)**的方式发布。你需要显式选择加入(opt-in)来试用该功能,通常是通过设置 GOEXPERIMENT 环境变量(稍后会详细讨论)。

如果一切顺利,经过一到两个版本之后,实验特性被最终确定,进入通用可用阶段,并变为默认开启(on-by-default)

如果一个实验特性影响了某些行为,那么它在进入通用可用阶段后,有时——但并非总是——会有一个过渡性的宽限期,在此期间可以临时禁用该特性并使用旧行为。例如,在 Go 1.26 中,新的垃圾回收器设计(上面简要提到过)进入了通用可用阶段并默认开启,但如果需要,仍然可以禁用它并使用旧的垃圾回收器。

以上就是最常见的模式,但有时候事情会更漫长或走向不同的方向。例如:

  • Go 1.22 发布时附带了编译器内联逻辑的实验性实现,两年多过去了,它仍然默认关闭,处于评估之中。
  • 同一次发布还附带了一个内存 arena 实验。在收到用户的负面反馈和顾虑之后,它仍然默认关闭,处于无限期搁置状态,最终可能会被完全移除。

或者,当 Go 团队对某个变更足够有信心时,他们可能会跳过反馈阶段,直接进入通用可用阶段……但仍然可能有一个过渡性的宽限期,在此期间可以禁用它。

一个很好的例子是 Go 1.24 将其 map 实现改为使用 Swiss tables。Go 团队对实现及其性能优势足够有信心,因此直接进入通用可用阶段并默认开启,但——至少目前——如果你愿意,仍然可以选择退出并使用旧的 map 实现。

所以在实践中,实验特性实际上有三种大致状态:

  • 默认关闭,评估中
  • 默认关闭,搁置/休眠中
  • 默认开启,但有临时退出选项

永久实验特性

Go 还有一些实验性功能,它们并非通常意义上的"实验"。

这些功能默认关闭,但它们不在评估中,不在寻求反馈,也没有预期它们最终会进入通用可用阶段并变为默认开启。

尽管它们通过 GOEXPERIMENT 环境设置以与其他实验相同的方式控制,但实际上它们更像是你可能在特定场景下想要使用的可选 Go 功能。

在下文中,我将这些称为"永久实验特性(permanent experiments)"。

例如,有一个 field tracking 诊断功能,用于追踪哪些结构体字段被访问。它已经存在十年了,并且没有意图让它进入通用可用阶段。还有一个 static lock ranking 功能,这是一个用于查找 Go 运行时中潜在死锁的诊断工具。

当前有哪些可用的实验特性?

要了解当前有哪些可用的实验特性及其状态,出奇地困难。

遗憾的是,Go 官方文档或 Go Wiki 中没有一个页面来追踪实验特性的状态,为了写这篇文章,我不得不从各处拼凑信息。如果你想做同样的事:

  • 可以运行 $ go doc goexperiment.Flags 获取所有可用实验的列表。
  • 可以通过阅读 src/internal/buildcfg/exp.go 的源码——特别关注 ParseGOEXPERIMENT() 函数中的 baseline 变量声明——来找出哪些实验是默认开启的。
  • 可以将实验名称与 Go 发布说明交叉对照,并搜索 GitHub issues 来尝试弄清当前的状态。

据我所知,截至 Go 1.26,以下是当前可用的永久实验特性:

实验名称 描述 状态
FieldTrack 追踪哪些结构体字段被访问的诊断工具 默认关闭,永久存在
StaticLockRanking 验证锁获取顺序以捕获死锁的诊断工具 默认关闭,永久存在
CgoCheck2 检查 cgo 指针传递规则的诊断工具;运行时开销太大,不适合默认开启 默认关闭,永久存在
BoringCrypto 用 FIPS 认证的 BoringSSL 替换 Go 的 crypto;自 Go 1.24 起已不再需要 默认关闭,永久存在,但很快将被移除
PreemptibleLoops 允许调度器在循环回边处抢占 goroutine;自 Go 1.14 起通常不再需要,但在不支持抢占的平台上可能仍然有用 默认关闭,永久存在

以下是当前默认关闭的实验特性及其状态:

实验名称 描述 状态
HeapMinimum512KiB 将最小堆大小从 4MB 减少到 512KiB;可能在受限环境中很有用 默认关闭,可能已休眠
Arenas 内存 arena 实现 默认关闭,收到负面反馈后已搁置
NewInliner 重写的编译器内联器,具有更好的调用点启发式算法 默认关闭,评估中(自 Go 1.22 起可用)
JSONv2 新的 encoding/json/v2 包,提供改进的 JSON 编码/解码函数 默认关闭,评估中(自 Go 1.25 起可用)
RuntimeSecret 新的 runtime/secret 包,提供清零内存的函数;仅支持 Linux amd64/arm64 默认关闭,评估中(自 Go 1.26 起可用)
GoroutineLeakProfile 新增 goroutineleak pprof 分析类型 默认关闭,评估中(自 Go 1.26 起可用)
SIMD 新的 simd/archsimd 包,提供对架构特定 SIMD 操作的访问;仅支持 amd64 默认关闭,评估中(自 Go 1.26 起可用)
RuntimeFreegc 在安全时允许立即重用内存而无需等待 GC 周期 默认关闭,评估中(自 Go 1.26 起可用,但状态信息见 #74299
SizeSpecializedMalloc 启用按大小类别特化的 malloc 实现 默认关闭,评估中(自 Go 1.26 起可用,但状态信息见 #74299

以下是当前默认开启的实验特性:

实验名称 描述 状态
LoopVar 每次迭代独立的循环变量作用域 Go 1.22 起默认开启,但为边缘情况保留了退出选项
Dwarf5 DWARF 5 调试信息生成;减小二进制文件大小 默认开启,保留临时退出选项(退出选项可能在未来的版本中被移除
RandomizedHeapBase64 在启动时随机化堆基址,作为安全措施 默认开启,保留临时退出选项(退出选项预计将在未来版本中移除
GreenTeaGC 新的垃圾回收器,具有更好的性能;在 darwin/ios/aix 上不可用 默认开启,保留临时退出选项(退出选项预计将在 Go 1.27 中移除
RegabiWrappers 用于在 ABI0 和 ABIInternal 函数之间调用的 ABI 包装器;仅支持 64 位架构 默认开启,保留临时退出选项,但退出选项仅对 s390x 有效,且将在 Go 1.27 中移除
RegabiArgs 在所有编译的 Go 函数中启用寄存器参数/返回值;仅支持 64 位架构 默认开启,保留临时退出选项,但退出选项仅对 s390x 有效,且将在 Go 1.27 中移除

如何启用和禁用实验特性?

实验特性通过 GOEXPERIMENT 环境设置来控制。

如果你想尝试某些默认关闭的实验特性,应将实验名称作为逗号分隔的小写值包含在 GOEXPERIMENT 中。例如,如果你想在构建应用程序时启用 JSONv2GoroutineLeakProfile 实验,可以这样做:

1
$ GOEXPERIMENT=jsonv2,goroutineleakprofile go build ./...

如果你想关闭某个默认开启的实验特性,可以在小写实验名称前加上 no 前缀。例如,如果你想在构建应用程序时关闭 GreenTeaGCRandomizedHeapBase64 实验,可以这样做:

1
$ GOEXPERIMENT=nogreenteagc,norandomizedheapbase64 go build ./...

混合启用和禁用的实验也完全没有问题:

1
$ GOEXPERIMENT=jsonv2,nogreenteagc go build ./...

注意,如果你使用不同的 GOEXPERIMENT 值构建同一个包,Go 会将它们视为不同的构建,并在构建缓存中存储独立的条目。

我在上面的示例中使用了 go build,但你在使用 go rungo test 时也可以使用完全相同的模式。如果你想亲自尝试,试着创建以下使用实验性 encoding/json/v2 包的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"encoding/json/v2"
"fmt"
)

type Person struct {
Name string `json:"name"`
Age int `json:"age"`
City string `json:"city"`
}

func main() {
p := Person{Name: "Ada", Age: 36, City: "Vienna"}

data, _ := json.Marshal(p, json.StringifyNumbers(true))
fmt.Println(string(data))
}

如果你正常运行此程序,它将无法编译,你会看到类似以下的错误消息:

1
2
3
$ go run main.go
package command-line-arguments
imports encoding/json/v2: build constraints exclude all Go files in /usr/local/go/src/encoding/json/v2

但如果你启用了 JSONv2 实验,程序将按预期运行:

1
2
$ GOEXPERIMENT=jsonv2 go run main.go
{"name":"Ada","age":"36","city":"Vienna"}

你应该关注哪些实验特性?

如果你像我一样是个普通的 Gopher,主要用 Go 编写程序而非开发 Go 本身,那么大多数可用的实验特性可能与你关系不大。

最有意思、最相关的几个可能是:

  • GreenTeaGC —— 如果你在使用 Go 1.26,你已经在默认使用它了。但如果你注意到任何性能或行为问题,你应该知道自己仍然可以禁用它(并且还应该提交一个 issue)。
  • Dwarf5 —— 同样,如果你在使用 Go 1.25 或更高版本,你已经在默认使用它了。但如果你遇到任何问题,知道自己仍然可以禁用它是有用的。
  • JSONv2 —— 我不建议在它进入通用可用阶段之前切换,但如果你编写大量处理 JSON 的代码,值得尝试新的 encoding/json/v2 包,熟悉即将到来的内容,并在发现问题时给出反馈。
  • GoroutineLeakProfile —— 这个特性可以立即派上用场,如果你怀疑有 goroutine 泄漏并需要调试,值得启用。
  • RuntimeSecret —— 如果你编写加密代码或需要处理敏感数据,值得尝试并给出反馈。
  • RuntimeFreegc —— 如果你的应用程序严重依赖垃圾回收器,可能值得在启用此特性的情况下对你的代码进行基准测试,看看是否提高了性能,并在发现问题时给出反馈。

最后,需要强调的是,实验特性不受 Go 兼容性承诺的覆盖。它们的 API、行为和性能特征都可能发生变化,因此通常最好避免过早采用,不要在实验特性最终确定之前依赖它们。

但实验特性通常是对 Go 中一些最重大变更的预览。如果你知道某个实验最终进入通用可用阶段并默认开启后可能会影响你或你的代码,那么尝试它、酌情运行基准测试、并在发现问题时给出反馈是个好主意。

如果你想追踪有哪些可用的实验特性及其状态,Go 发布说明最近在记录实验特性及其使用方式方面做得越来越好了。结合这篇博客文章和每次 Go 新版本发布时浏览发布说明,你应该能对整体情况有一个不错的了解。


原文来源:Alex Edwards, "Go Experiments Explained", June 1, 2026, https://www.alexedwards.net/blog/go-experiments-explained