
Go 1.19 发布于 2022-08-02。这一版没有泛型那样醒目的语法变化，但对运行时内存控制、并发语义和文档工具链都很关键。

源码侧 `api/go1.19.txt` 有 309 条公开 API 增量；公开标准库目录新增 `crypto/boring`、`crypto/tls/fipsonly`、`go/doc/comment`。

## 主要变化

### 1. 内存模型描述更清楚

Go 1.19 修订了内存模型，重点是说明 goroutine 之间什么时候能观察到彼此写入。锁、channel、原子操作、初始化顺序都和 happens-before 关系有关。

例如，向 channel 发送发生在对应接收完成之前；`Mutex.Unlock` 发生在后续成功 `Lock` 之前；原子操作有自己的顺序保证。它不是鼓励写 lock-free 代码，而是给并发代码的正确性提供明确边界。

### 2. `GOMEMLIMIT` 提供软内存限制

`GOMEMLIMIT` 和 `debug.SetMemoryLimit` 给运行时一个软目标：尽量把 Go 堆、GC 元数据和运行时管理的内存控制在限制附近。它不是操作系统级硬限制，但能影响 GC 触发频率和堆增长策略。

```bash
GOMEMLIMIT=512MiB ./server
```

也可以在程序里设置：

```go
debug.SetMemoryLimit(512 << 20)
```

它关注的是 Go 运行时管理的内存，不等于进程 RSS。cgo、mmap、内核缓存等仍然需要单独理解。

### 3. `sync/atomic` 增加类型化 API

类型化原子值让 `atomic.Int64`、`atomic.Bool`、`atomic.Pointer[T]` 这类写法成为可能。

```go
var requests atomic.Int64
requests.Add(1)
fmt.Println(requests.Load())
```

相比裸函数调用，它减少了地址传错、类型混淆和可读性差的问题，也让泛型指针原子操作更自然。方法名表达内存安全操作，读代码时也更容易识别共享状态。

### 4. `go/doc/comment` 标准化文档注释解析

Go 文档注释有自己的段落、列表、代码块和链接规则。`go/doc/comment` 把这套解析和格式化能力放进标准库，工具作者不用各自重新实现一套近似逻辑。文档生成器、lint、编辑器插件都能受益。

这个包的价值在于保持生态一致：同一段注释在 `go doc`、pkg.go.dev 和第三方工具里应尽量按同样规则解释。

## 语言与规范

Go 1.19 没有语法变化，但内存模型更新很重要。它把 Go 的 happens-before、原子操作、同步原语之间的关系讲得更清楚，尤其是对写 lock-free 代码的人。

## 工具链与运行时

运行时新增软内存限制，可以通过 `GOMEMLIMIT` 或 `debug.SetMemoryLimit` 控制。这不是硬限制，但能让 GC 在接近限制时更积极工作，对容器部署和多租户环境很有价值。

工具链方面新增 `unix` 构建约束，`go vet` 增加和原子类型、路径查找相关的检查。LoongArch 64-bit 成为新的端口。

## 标准库与新增包

新增公开包：

- `go/doc/comment`：解析和格式化 Go 文档注释。
- `crypto/boring`、`crypto/tls/fipsonly`：面向特定加密合规场景。

关键 API：

- `sync/atomic` 新增 `Int64`、`Uint64`、`Bool`、`Pointer[T]` 等类型化原子操作。
- `runtime/debug.SetMemoryLimit` 和相关指标支持软内存限制。
- `os/exec` 的 PATH 查找行为收紧，降低路径劫持风险。

## 小版本特殊变化

Go 1.19 系列共有 13 个小版本。`GOMEMLIMIT` 和内存模型之外，小版本重点落在 HTTP、TLS、模板、multipart、runtime 和 `cmd/go`。

这一系列的安全修复非常贴近 Web 服务。`mime/multipart` 处理表单上传，风险通常和边界分隔符、临时文件、内存占用和异常输入有关。`html/template` 是 XSS 防线的一部分，安全修复通常意味着某些上下文下自动转义不够准确。`net/textproto` 和 `net/url` 影响 HTTP 头和 URL 解析，代理、网关和鉴权逻辑都可能依赖这些解析结果。`cmd/go` 的安全修复则属于供应链入口：模块下载、版本控制命令调用、校验和缓存都在这条链路上。

- `go1.19.1` 修复 `net/http`、`net/url` 安全问题，并修 `crypto/tls`、`crypto/x509`。
- `go1.19.6` 安全修复覆盖 `crypto/tls`、`mime/multipart`、`net/http`、`path/filepath`。
- `go1.19.8` 修复 `go/parser`、`html/template`、`mime/multipart`、`net/http`、`net/textproto` 安全问题。
- `go1.19.9` 包含 3 个 `html/template` 安全修复。
- `go1.19.10` 包含 `cmd/go` 和 runtime 的 4 个安全修复，这是工具链和运行时层面的高优先级修复。
- `go1.19.11` 修复 `net/http` 安全问题，并修 cover 工具、`go/printer` 等。
- `go1.19.12` 修复 `crypto/tls` 安全问题。
- `go1.19.13` 主要修 `go` 命令、`crypto/tls`、`net/http`，是该系列收尾小版本。

## 参考

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

