
Go 1.15 发布于 2020-08-11。这一版没有激进功能，重点是工具链、链接器、二进制体积和安全默认值的工程化改进。

源码侧 `api/go1.15.txt` 有 130 条公开 API 增量；公开标准库目录新增 `time/tzdata`。

## 主要变化

### 1. 链接器继续瘦身

Go 1.15 的链接器工作重点是降低资源占用并改善输出质量。链接阶段会影响大项目的构建耗时、内存占用和最终二进制体积。这个方向看起来不如新语法显眼，但对 CI、容器镜像和本地开发反馈速度都很实际。

Go 程序通常是静态链接倾向，最终二进制会包含运行时和用到的库代码。链接器优化可以减少无用符号、改进重定位处理，并降低链接过程中的峰值内存。对命令行工具和微服务镜像来说，二进制体积也会直接影响分发成本。

### 2. `time/tzdata` 让时区数据可嵌入

`time/tzdata` 的作用是把 IANA 时区数据库编进程序。这样程序即使运行在极简镜像、scratch 镜像或缺少系统时区文件的环境里，也可以解析命名时区。它通过空导入生效，属于部署形态相关的标准库能力。

```go
import _ "time/tzdata"
```

有了它，`time.LoadLocation("Asia/Shanghai")` 不必完全依赖系统路径中的 tzdata 文件。代价是二进制会变大，因为时区数据库被打进去了。

### 3. X.509 弱化 CommonName

证书主机名验证不再依赖传统 CommonName，而是推动使用 Subject Alternative Name。这个变化反映了 Web PKI 的长期方向：SAN 才是主机名身份的标准位置。标准库在这里选择更严格、更现代的安全语义。

CommonName 最早用于证书主体名称，但现代证书主机名匹配应看 SAN 扩展。Go 标准库调整这个行为后，`crypto/x509` 的验证逻辑更接近浏览器和 CA 生态的主流规则。

### 4. `go vet` 增加错误模式识别

`go vet` 新增对 `string(x)` 可疑转换、不可能接口转换等问题的检查。这类检查关注的是“编译能过，但几乎肯定不是作者想表达的代码”。它让工具链更早发现低级逻辑错误。

`string(x)` 的典型问题是把整数转成单个 Unicode code point，而不是十进制字符串。如果想把数字 `123` 变成 `"123"`，应该用 `strconv.Itoa` 或 `fmt.Sprint`。vet 把这种常见误解前移到静态检查阶段。

## 语言与规范

Go 1.15 没有语言语法变化。它延续 Go 1 兼容承诺，把重点放在工具链质量和安全行为上。

## 工具链与运行时

链接器是这一版的大头。Go 1.15 的链接器减少资源占用，并为后续版本更大的链接器改造打基础。`go test`、flag 解析、模块缓存、cgo 和 objdump 也有细节变化。

`go vet` 增加了对 `string(x)` 可疑转换、不可能的接口转换等问题的检查。这类检查对大型代码库很有价值，因为它们通常能在 review 前发现低级错误。

## 标准库与新增包

新增公开包：

- `time/tzdata`：导入后可以把时区数据库嵌入二进制，适合容器镜像、scratch 镜像和缺少系统 tzdata 的部署环境。

重要变化：

- `crypto/x509` 废弃 CommonName 主机名匹配。
- `crypto/tls`、`crypto/rsa`、`crypto/ecdsa` 有安全和兼容性更新。
- `net/http`、`net/url`、`database/sql`、`encoding/json` 等包有小幅 API 或行为改进。

## 小版本特殊变化

Go 1.15 系列共有 15 个小版本，安全修复覆盖 HTTP、XML、ZIP、TLS、椭圆曲线和代理路径。

这组安全修复基本覆盖了服务端程序最常见的不可信输入入口。`encoding/xml` 处理结构化文本输入，风险通常来自实体、深度、递归或异常 token。`archive/zip` 处理压缩包，重点是路径穿越、文件名规范化和解压资源消耗。`net/http/httputil` 常用于反向代理，安全问题可能影响请求重写、头部转发或后端选择。`crypto/tls`、`crypto/elliptic`、`math/big` 处在 TLS 和密码学运算底层，修复的影响面通常比业务代码直接看到的 API 更大。

- `go1.15.1` 修复 `net/http/cgi` 和 `net/http/fcgi` 安全问题。
- `go1.15.5` 修复 `go` 命令和 `math/big` 安全问题。
- `go1.15.9` 修复 `encoding/xml` 安全问题，XML 解析属于典型不可信输入入口。
- `go1.15.12` 包含 `net/http` 安全修复，并修 compiler、runtime、`archive/zip`、`syscall`、`time`。
- `go1.15.13` 安全修复范围较广，涉及 `archive/zip`、`math/big`、`net`、`net/http/httputil`。
- `go1.15.14` 修复 `crypto/tls` 安全问题，`go1.15.15` 修复 `net/http/httputil` 安全问题。

## 参考

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

