
Go 1.12 发布于 2019-02-25。它没有引入新语法，重点是继续把 Go 1.11 开始的模块系统打磨得更可用，同时把 TLS 1.3 带进标准库。

源码侧 `api/go1.12.txt` 有 228 条公开 API 增量；公开标准库目录相对 Go 1.11 没有新增包，说明这一版主要是在现有包和工具链上做增强。

## 主要变化

### 1. Go Modules 继续稳定行为

Go 1.12 的模块变化不如 1.11 醒目，但很关键。`go get`、包加载、版本选择和模块缓存都继续修正边界行为，让模块模式从“能用”走向“稳定可依赖”。这一阶段仍然保留 GOPATH 工作流，因此很多行为都带着过渡期特征。

一个典型变化是模块命令更清楚地区分“修改依赖”和“构建包”。`go get` 逐渐承担模块版本调整职责，`go build`、`go test` 则更多负责按模块图构建。这个分工后来继续演进，但 Go 1.12 已经能看到方向。

### 2. TLS 1.3 进入 `crypto/tls`

TLS 1.3 是协议层面的重要更新：握手更少、密码套件更现代、旧协议里一些容易出错的组合被移除。Go 1.12 在标准库里加入 TLS 1.3 支持，意味着使用 `net/http` 或直接使用 `crypto/tls` 的程序可以受益于新的协议实现。

对应用代码来说，很多场景不需要改配置。`http.Server`、`http.Client` 底层都走 `crypto/tls`，只要双方协商成功，就能使用 TLS 1.3。真正需要关注的是低层 TLS 配置：如果代码手动限制 `MinVersion`、`MaxVersion` 或密码套件，就会影响最终协商结果。

### 3. 运行时更积极归还内存

Go 运行时会把不再使用的堆页还给操作系统。Go 1.12 改进了这部分策略，负载下降后进程常驻内存更容易回落。对长时间运行的服务，这会影响容器内存占用、监控曲线和资源调度表现。

这里的“归还”不是 Go 对象级别的释放，而是运行时把空闲页通过操作系统机制释放或标记为可回收。Go 堆仍然由 GC 管理，程序也不需要手动释放对象。

### 4. 多平台端口继续补齐

Windows、AIX、Darwin 等端口都有变化。端口支持不只是能编译，还包含 syscall、链接、调试信息、cgo、文件系统语义等细节。Go 1.12 在这些方向继续把跨平台体验做扎实。

AIX 端口进入更可用状态，Darwin 和 Windows 的系统接口也继续补齐。对跨平台库来说，这类变化意味着更少的 build tag 分叉和更一致的标准库行为。

## 语言与规范

Go 1.12 没有语言层面的变化。兼容性策略仍然是 Go 1 promise：绝大多数 Go 1 程序应继续正常编译运行。

## 工具链与运行时

`go tool vet` 不再作为独立入口推荐，使用方式逐步收敛到 `go vet`。模块相关命令继续改进，`go get`、版本选择和包加载的行为更稳定。

运行时方面，Go 1.12 改进了堆内存释放策略，程序空闲后更容易把内存还给操作系统。这对长时间运行的服务更重要，尤其是负载有明显波峰波谷的场景。

## 标准库与新增包

这一版没有新增公开标准库包。重点变化在现有包：

- `crypto/tls` 支持 TLS 1.3。
- `net/http`、`net/url`、`net/http/httputil` 有协议和边界行为修正。
- `syscall/js` 继续补强 WebAssembly 调用能力。
- `testing`、`reflect`、`strings`、`time` 等包增加小 API 或修复细节。

例如 `strings.ReplaceAll` 这类小 API 能减少模板式写法。过去常写 `strings.Replace(s, old, new, -1)`，参数 `-1` 的含义并不直观；专门的 API 直接表达“全部替换”。

## 小版本特殊变化

Go 1.12 系列共有 17 个小版本，安全修复密度很高，也有两个发布流程层面的特殊点。

这一系列的安全问题集中在网络协议、证书和操作系统边界。`net/http`、`net/textproto`、`net/http/httputil` 都处在 HTTP 头、代理和协议文本解析路径上，问题通常影响服务端接收不可信请求或反向代理转发请求的行为。`crypto/x509` 影响证书验证，风险是错误接受证书或错误解释证书约束。`crypto/dsa` 属于签名算法实现，安全修复通常和参数校验、签名验证或边界输入有关。`os`、`path/filepath` 则多和路径处理、平台差异、文件系统边界有关。

- `go1.12.2` 包含 runtime 安全修复，同时修 compiler、`go` 命令、`net/http/httputil`、`os` 等组件。
- `go1.12.3` 是误发布版本，内容等同 `go1.12.2`；真正修复放在 `go1.12.4`。
- `go1.12.4` 修复旧 GNU/Linux 上预编译二进制结合 cgo 链接失败的问题。
- `go1.12.8`、`go1.12.10`、`go1.12.15` 都涉及 `net/http` 或 `net/textproto`，说明 HTTP 协议解析和边界输入是这一阶段安全修复重点。
- `go1.12.11` 修复 `crypto/dsa` 安全问题，`go1.12.16` 修复两个 `crypto/x509` 安全问题。
- `go1.12.13` 专门处理 macOS 10.15 Catalina 下未 notarize 安装器和二进制被 Gatekeeper 拒绝的问题。

## 参考

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

