
Go 1.24 发布于 2025-02-11。这一版把泛型类型别名做成正式能力，并把工具依赖、私有模块认证、加密库和测试并发控制都向前推进了一步。

源码侧 `api/go1.24.txt` 有 223 条公开 API 增量；公开标准库目录新增 `crypto/fips140`、`crypto/hkdf`、`crypto/mlkem`、`crypto/pbkdf2`、`crypto/sha3`、`testing/synctest`、`weak`。

## 主要变化

### 1. 泛型类型别名正式支持

Go 1.24 让类型别名可以带类型参数。它的价值在于 API 组织：包可以重新导出泛型类型，或者在拆分内部实现时保留对外名字。

```go
package public

import "example.com/internal/set"

type Set[T comparable] = set.Set[T]
```

别名仍然是别名，不会创建新的定义类型。也就是说，赋值、方法集和类型身份都按原类型处理。它适合“换包不换 API 名字”或“把内部实现重新导出”的场景。

### 2. `go.mod` 新增 `tool` 指令

工具依赖长期用 `tools.go` 空导入来固定版本。`tool` 指令把这件事写进模块文件，表示“这个模块需要这些 Go 工具”。

```go
module example.com/app

go 1.24

tool golang.org/x/tools/cmd/stringer
```

配合 `go tool`，代码生成器、lint 工具、mock 工具等可以被更明确地管理。`go get -tool` 会同时添加 `tool` 指令和需要的 `require`。这样工具版本进入模块图，团队里每个人运行的是同一组工具依赖。

### 3. `GOAUTH` 统一私有模块认证入口

私有模块下载涉及代理、源码仓库、凭据和校验策略。`GOAUTH` 提供统一认证机制，减少每种 VCS 或代理各自配置的碎片化。它面向的是模块获取链路，不影响业务程序自己的认证逻辑。

这个能力的意义在于把“Go 命令如何拿到私有模块凭据”变成显式配置。企业内部常见的私有 Git、私有 module proxy、单点登录脚本都可以围绕这个入口组织，而不是依赖开发机上偶然存在的全局 git 配置。

### 4. 加密、弱引用和并发测试同时扩展

`crypto/mlkem` 提供后量子密钥封装机制，`crypto/hkdf`、`crypto/pbkdf2`、`crypto/sha3` 从扩展生态进入标准库，`crypto/fips140` 服务合规场景。

`weak` 提供弱引用。普通指针会让对象保持可达，弱引用不会。它适合缓存、规范化表和附属元数据这类“不想因为缓存引用阻止对象回收”的结构。

`testing/synctest` 则帮助测试并发代码里的时间和调度行为。并发测试最难的地方是依赖真实时间和调度顺序，`synctest` 的目标是把这些不可控因素收进测试环境里。

## 语言与规范

Go 1.24 完整支持泛型类型别名。类型别名可以像定义类型一样带类型参数，这对泛型 API 组织、拆包重构和保持兼容导出名很有用。

## 工具链与运行时

`go.mod` 的 `tool` 指令是工程体验改进。过去常见做法是在 `tools.go` 里空导入工具包，现在可以用模块文件显式追踪工具依赖，并通过 `go tool` 运行。

`go build`、`go install`、`go test -json` 增加结构化 JSON 输出。`GOAUTH` 为私有模块下载认证提供统一入口。cgo 新增 `#cgo noescape` 和 `#cgo nocallback` 注解，帮助优化调用成本。

`#cgo noescape` 表示传给 C 的 Go 指针不会在调用返回后继续被 C 保存；`#cgo nocallback` 表示 C 调用期间不会回调 Go。编译器和运行时知道这些事实后，可以减少逃逸和回调准备成本。它们是低层优化注解，适合非常清楚 C 代码行为的绑定层。

## 标准库与新增包

新增公开包：

- `weak`：弱引用能力。
- `crypto/mlkem`：后量子 ML-KEM。
- `crypto/hkdf`、`crypto/pbkdf2`、`crypto/sha3`：从扩展库进入标准库。
- `crypto/fips140`：FIPS 140-3 相关能力。
- `testing/synctest`：实验性并发测试控制。

其他变化包括目录受限文件系统访问、benchmark 新写法、finalizer 改进和大量 crypto 包更新。

Go 1.24 还继续把 Go 1.23 的迭代器能力铺到标准库。`maps.All`、`maps.Keys`、`maps.Values` 会返回迭代器，`maps.Collect` 可以把键值迭代器收集回 map：

```go
for k, v := range maps.All(m) {
    fmt.Println(k, v)
}

keys := slices.Sorted(maps.Keys(m))
clone := maps.Collect(maps.All(m))
```

这和 [Go 1.23 的 `iter.Seq` / `iter.Seq2`](/go-1-23-release-notes/) 是同一条演进线：1.23 先定义迭代器语法和基础包，1.24 开始把常用集合 API 接到这套模型上。

`testing/synctest` 在这一版仍是实验性包，主要用于控制并发测试里的时间和调度。到 [Go 1.25](/go-1-25-release-notes/) 它成为正式包，所以这两个版本要连起来看。

## 小版本特殊变化

Go 1.24 系列截至 2026-02-04 有 13 个小版本。`tool` 指令、FIPS、ML-KEM、`weak` 等能力发布后，小版本仍然以安全和工具链修复为主。

Go 1.24 的安全修复里，归档、证书和编码包非常突出。`archive/tar`、`archive/zip` 要重点关注路径穿越、符号链接、文件名规范化和解压资源消耗。`crypto/x509`、`crypto/tls` 影响证书和 TLS；`encoding/asn1`、`encoding/pem` 是证书、密钥和加密材料常用编码层，解析 bug 可能影响整个加密栈。`net/mail`、`net/textproto`、`net/url` 属于文本协议解析边界。`go` 命令安全修复和 `tool` 指令一起看，说明工具依赖也属于供应链安全的一部分。

- `go1.24.1` 修复 `net/http` 安全问题，并修 cgo、compiler、`go` 命令、reflect、runtime、syscall。
- `go1.24.2` 修复 `net/http` 安全问题，并修 `crypto/tls`、`go/types`、testing。
- `go1.24.4` 修复 `crypto/x509`、`net/http`、`os` 安全问题，同时修 `hash/maphash`。
- `go1.24.8` 是大范围安全修复：`archive/tar`、`crypto/tls`、`crypto/x509`、`encoding/asn1`、`encoding/pem`、`net/http`、`net/mail`、`net/textproto`、`net/url`。
- `go1.24.11` 包含两个 `crypto/x509` 安全修复。
- `go1.24.12` 修复 `go` 命令、`archive/zip`、`crypto/tls`、`net/url` 安全问题。
- `go1.24.13` 修复 `go` 命令和 `crypto/tls` 安全问题，并修 `crypto/x509`。

## 参考

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

