
Go 1.25 发布于 2025-08-12。这一版没有影响程序写法的语言变化，重点转向运行时对容器的默认适配、GC 实验和 JSON v2。

源码侧 `api/go1.25.txt` 有 111 条公开 API 增量；公开标准库目录新增 `encoding/json/jsontext`、`encoding/json/v2`。

## 主要变化

### 1. `GOMAXPROCS` 感知容器 CPU 限额

Go 1.25 会参考 Linux cgroup 的 CPU 带宽限制设置默认 `GOMAXPROCS`，并能随环境变化更新。它解决的是容器里常见的错配：进程看到宿主机有很多 CPU，但实际只被限制到较小配额。

行为上，运行时会综合 CPU affinity、逻辑 CPU 数和 cgroup CPU quota 计算默认并行度。程序仍然可以显式调用 `runtime.GOMAXPROCS`，也可以通过 `GODEBUG=containermaxprocs=0` 关闭容器感知默认值，通过 `GODEBUG=updatemaxprocs=0` 关闭周期性更新。Go 1.25 还提供 `runtime.SetDefaultGOMAXPROCS`，用于让程序重新采用运行时计算出的默认值。

### 2. Green Tea GC 作为实验能力发布

Green Tea GC 关注标记阶段的局部性和小对象扫描效率。它不是新的内存管理接口，而是运行时内部垃圾回收实现的实验方向。官方说明里预期在大量使用 GC 的真实程序中，GC 开销可能有 10%-40% 的下降，但具体收益取决于对象形态和分配模式。

它的价值在于把优化放在运行时内部：业务代码不需要换 allocator，也不需要使用新 API。观察点应该是 GC CPU、暂停时间、堆大小和吞吐，而不是源码层面的调用变化。

### 3. trace flight recorder 提供低成本持续跟踪

传统 trace 通常需要在问题发生前显式开启，成本也不适合长期开。flight recorder 的思路是持续保留近期 trace 数据，真正需要分析时再取出。它适合定位偶发延迟、调度异常和短时间性能尖刺。

这个功能改变的是排障模型：不是“问题发生前先猜到要开 trace”，而是“程序一直保留一个短窗口”。当服务出现异常时，可以导出最近窗口里的调度、网络阻塞、系统调用、GC 等事件，再用 trace UI 分析。

Go 1.25 给出的不是概念，而是明确 API：`runtime/trace.FlightRecorder`。典型用法是先创建 recorder，再 `Start()` 持续写入内存环形缓冲；当异常发生时，用 `WriteTo` 把最近窗口落盘：

```go
fr := trace.NewFlightRecorder(trace.FlightRecorderConfig{})
fr.Start()

// 发生异常后导出最近一段 trace。
f, _ := os.Create("flight.out")
defer f.Close()
fr.WriteTo(f)
fr.Stop()
```

`FlightRecorderConfig` 可以限制保留窗口的时长和数据量，所以它不是“全天候完整 trace”，而是“保留最近几秒关键证据”的轻量方案。

### 4. `encoding/json/v2` 进入实验阶段

`encoding/json/v2` 和 `encoding/json/jsontext` 试图解决旧 `encoding/json` 的长期设计限制，包括更清晰的语义、更可组合的底层 token 处理和更严格的行为控制。启用方式是构建时设置 `GOEXPERIMENT=jsonv2`：启用后这两个新包可用，同时原来的 `encoding/json` 也会切到新实现。官方承诺 marshal/unmarshal 语义保持不变，但错误消息文本可能变化。

`jsontext` 更偏底层，处理 JSON token、语法和值的读写；`json/v2` 更偏面向 Go 值的 marshal/unmarshal。拆成两层后，想写高性能转换器、格式化器、校验器时，不必绕过整个 `encoding/json` 或复制内部逻辑。

### 5. `testing/synctest` 正式发布

`testing/synctest` 是 Go 1.25 很容易被低估的新包。它的核心价值不是“多一个测试 helper”，而是给并发测试提供一个隔离 bubble：`synctest.Test` 在 bubble 里运行测试函数，里面的时间不再使用真实时钟，而是从一个假的初始时刻开始。

更关键的是，这个 fake clock 不是匀速走的，而是“当 bubble 里的 goroutine 都已经稳定阻塞时再瞬间推进”。这让 `time.Sleep`、`time.After`、重试退避、ticker 之类的逻辑，可以在测试里快速推进而不必真实等待几百毫秒或几秒钟。

```go
synctest.Test(t, func(t *testing.T) {
    done := make(chan struct{})
    go func() {
        time.Sleep(time.Second)
        close(done)
    }()

    synctest.Wait()
    <-done
})
```

`synctest.Wait()` 的语义是“等 bubble 内其他 goroutine 都进入稳定阻塞状态”，它提供了一个非常适合并发测试的确定性同步点。对依赖 timer、context deadline、重试逻辑的代码，这个包的意义往往比单纯的 mock clock 更大。

## 语言与规范

Go 1.25 没有影响 Go 程序的语言变化。规范层面移除了“core types”概念，改用更具体的文字描述。这主要影响读规范和实现工具的人，普通业务代码基本无感。

## 工具链与运行时

容器感知 `GOMAXPROCS` 是服务端最重要的默认值变化。过去 Go 默认按宿主机逻辑 CPU 数设置并行度，在 Kubernetes 这类有 CPU limit 的环境里可能过高。Go 1.25 会参考 cgroup CPU 带宽限制，并周期性更新。

实验性 Green Tea GC 关注小对象标记和扫描的局部性。trace flight recorder 则让程序可以持续保留近期 trace，出问题后再导出。

工具方面，`go.mod` 新增 `ignore` 指令；`go doc -http` 可启动文档服务；`go version -m -json` 输出结构化构建信息；`go vet` 增加 WaitGroup 和 host:port 相关检查。

`go.mod` 的 `ignore` 指令用于告诉 Go 命令忽略指定目录中的模块。这对包含示例、测试数据、嵌套仓库或临时模块的仓库很有用，避免命令在遍历时把不该纳入的模块当成工作内容。

`go version -m -json` 能把二进制里的模块信息用 JSON 输出。自动化系统可以直接解析主模块、依赖版本、构建设置，而不需要从纯文本里拆字段。

这个能力很适合 CI/CD 和制品扫描。例如构建完成后，流水线可以对二进制执行：

```bash
go version -m -json ./server
```

然后把输出交给漏洞扫描、SBOM 生成或发布审计流程。相比解析纯文本，JSON 输出能稳定读取主模块、依赖模块、构建参数和 VCS 信息，方便回答“这个线上二进制到底用了哪个依赖版本”。

## 标准库与新增包

新增公开包：

- `encoding/json/v2`：实验性 JSON v2 API。
- `encoding/json/jsontext`：底层 JSON token/text 处理能力。

重要变化：

- `testing/synctest` 从实验走向正式包。
- `crypto` 系列继续强化默认安全行为。
- `runtime/pprof`、`runtime/trace` 增强诊断能力。

## 小版本特殊变化

Go 1.25 系列截至 2026-05-07 有 10 个小版本。下面不按时间把 10 个版本逐条流水账列完，而是挑与本文主题更相关、或者覆盖面更广的代表性版本来说明。容器感知 `GOMAXPROCS`、`json/v2`、`testing/synctest` 发布后，小版本修复覆盖运行时、JSON 邻近路径、HTTP、TLS 和 FIPS。

这一系列的安全修复覆盖了服务端程序的几乎整条输入链路：`net/http` 接请求，`net/textproto` 解析头，`net/url` 解析 URL，`mime` 处理内容类型，`html/template` 输出页面，`archive/tar` 和 `archive/zip` 处理上传或制品包，`crypto/tls` 和 `crypto/x509` 建立连接信任。`pack` 工具、`go` 命令和 `os/exec` 则属于构建与工具执行链路。`crypto/fips140` 出现在 Bug 修复里，说明 FIPS 相关实现也在小版本中继续校正。

- `go1.25.1` 修复 `net/http` 安全问题，并修 `go` 命令、`net`、`os`、`os/exec`、`testing/synctest`。这里的 `testing/synctest` 是 Go 1.25 正式化的新包。
- `go1.25.2` 是大范围安全修复：`archive/tar`、`crypto/tls`、`crypto/x509`、`encoding/asn1`、`encoding/pem`、`net/http`、`net/mail`、`net/textproto`、`net/url`。
- `go1.25.3` 专门修 `crypto/x509`。
- `go1.25.6` 修复 `go` 命令、`archive/zip`、`crypto/tls`、`net/url` 安全问题，并修 `errors`、`os`。
- `go1.25.8` 修复 `html/template`、`net/url`、`os` 安全问题。
- `go1.25.9` 修复 `go` 命令、compiler、`archive/tar`、`crypto/tls`、`crypto/x509`、`html/template`、`os` 安全问题。
- `go1.25.10` 修复 `go` 命令、`pack` 工具、`html/template`、`net`、`net/http`、`net/http/httputil`、`net/mail`、`syscall` 安全问题，同时修 runtime、linker、`crypto/fips140`、`go/types`。

## 参考

- [Go 1.25 Release Notes](https://go.dev/doc/go1.25)
- [Go Release History](https://go.dev/doc/devel/release)
- [Go 1.25 source tag](https://go.googlesource.com/go/+/refs/tags/go1.25.0)
- [api/go1.25.txt](https://go.googlesource.com/go/+/refs/tags/go1.25.0/api/go1.25.txt)

