
Go 1.17 发布于 2021-08-16。这一版没有新增公开标准库包，但对模块依赖图、构建约束写法和编译器调用规约都有长期影响。

源码侧 `api/go1.17.txt` 有 303 条公开 API 增量，公开标准库目录相对 Go 1.16 没有新增包。

## 主要变化

### 1. 模块图裁剪减少不必要加载

声明 `go 1.17` 的模块会使用裁剪后的模块图。Go 命令只需要加载和当前构建相关的依赖信息，不必把完整传递依赖图都展开。

行为上，`go.mod` 会更明确记录 indirect 依赖。看起来 indirect 行变多了，但这是为了让裁剪后的模块图仍然能复现构建结果。大型项目的包加载、`go list` 和版本选择会因此更轻。

### 2. `//go:build` 取代难读的旧约束

旧的 `// +build` 语法用空格和逗号表达布尔关系，复杂条件很难读。`//go:build` 使用接近 Go 表达式的写法：

```go
//go:build linux && (amd64 || arm64)
```

语义更直观，也更容易被工具解析。`gofmt` 会帮助维护新旧约束的一致性，因此源码里可以同时保留两种形式，让不同 Go 版本的工具都能理解。

### 3. 新调用规约提升函数调用效率

Go 1.17 在 amd64 等平台引入寄存器调用规约，参数和返回值更多通过寄存器传递。普通 Go 代码不需要感知这个细节，但运行结果是函数调用成本下降。手写汇编和低层工具才需要关心 ABI 细节。

这个变化也解释了为什么 Go 版本的性能提升有时不来自源码 API。运行时、编译器和 ABI 改动可以让同一份 Go 代码生成更好的机器码。

### 4. URL 与 TLS 行为更严格

`net/url` 对查询字符串解析更严格，`crypto/tls` 对 ALPN 行为也更严格。这类变化体现了标准库的安全取向：模糊输入和非标准协议协商不应该长期被静默接受。

例如 URL query 中的分号处理更严格，避免服务器和代理对同一 URL 有不同理解。TLS ALPN 更严格则减少协议协商被误用或降级的空间。

## 语言与规范

Go 1.17 没有语言语法变化。构建约束从旧的 `// +build` 转向更清晰的 `//go:build`，并由 `gofmt` 帮助保持两种格式一致。

## 工具链与运行时

模块图裁剪是核心变化。对于声明 `go 1.17` 的模块，`go.mod` 会更明确地记录间接依赖，同时构建时不必加载不相关依赖的完整图。这改善了大型项目的模块加载性能和可重复性。

编译器引入新调用规约，在支持平台上更多参数通过寄存器传递。这个变化通常无需业务代码适配，但对汇编、cgo 和低层调试工具有影响。

## 标准库与新增包

这一版没有新增公开标准库包。重要变化包括：

- `net/url` 对分号等查询字符串行为更严格。
- `crypto/tls` 强化 ALPN 相关行为。
- `runtime/metrics` 增加更多指标。
- `archive/zip`、`database/sql`、`net/http`、`reflect` 等包有 API 和行为补强。

## 小版本特殊变化

Go 1.17 系列共有 13 个小版本，模块图裁剪和新 ABI 之后，修复主要落在工具链、runtime、归档格式和安全边界。

安全修复覆盖面很宽：归档和压缩类的 `archive/zip`、`compress/gzip` 关注路径、解压和畸形输入；解析类的 `encoding/gob`、`encoding/xml`、`go/parser` 关注不可信数据导致的资源消耗或异常解析；执行边界类的 `os/exec`、`path/filepath` 关注命令查找和路径解释；密码学类的 `crypto/rand`、`crypto/tls`、`crypto/elliptic`、`math/big` 影响随机数、TLS 和底层运算。`io/fs` 出现在安全修复里，也说明新文件系统抽象很快进入了真实安全边界。

- `go1.17.1` 修复 `archive/zip` 安全问题，并修 compiler、linker、`go` 命令、`embed`、`go/types`、`html/template`、`net/http`。
- `go1.17.2` 包含 linker 和 `misc/wasm` 安全修复。
- `go1.17.3` 修复 `archive/zip` 和 `debug/macho` 安全问题。
- `go1.17.5` 修复 `net/http` 和 `syscall` 安全问题。
- `go1.17.7` 安全修复覆盖 `go` 命令、`crypto/elliptic`、`math/big`。
- `go1.17.11` 修复 `crypto/rand`、`crypto/tls`、`os/exec`、`path/filepath` 安全问题。
- `go1.17.12` 安全修复范围很广：`compress/gzip`、`encoding/gob`、`encoding/xml`、`go/parser`、`io/fs`、`net/http`、`path/filepath`。
- `go1.17.13` 修复 `encoding/gob` 和 `math/big` 安全问题。

## 参考

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

