
Go 1.13 发布于 2019-09-03。这一版是 Go 1.11 之后第一个明显影响日常编码习惯的版本：数字字面量更灵活，错误处理正式引入包装、匹配和展开 API。

源码侧 `api/go1.13.txt` 记录了 8032 条 API 增量，其中大量来自平台 syscall；公开标准库目录相对 Go 1.12 新增 `crypto/ed25519`。

## 主要变化

### 1. 数字字面量更适合表达真实数据

Go 1.13 支持 `0b` 二进制、`0o` 八进制和 `_` 数字分隔符。权限位、掩码、协议字段、测试向量都可以写得更接近原始含义。

```go
const (
    mask = 0b1111_0000
    perm = 0o755
    max  = 1_000_000
)
```

这类变化不增加语言复杂度，但能减少“数字到底是什么意思”的认知成本。编译器会忽略分隔符，所以它只影响源码可读性，不影响运行时表示。

### 2. 错误链成为标准能力

`fmt.Errorf("%w")` 可以包装错误，`errors.Unwrap` 可以展开一层，`errors.Is` 用于判断错误链里是否包含某个 sentinel error，`errors.As` 用于提取某类错误。

```go
if err != nil {
    return fmt.Errorf("read config: %w", err)
}

if errors.Is(err, fs.ErrNotExist) {
    useDefault()
}
```

这让错误处理从“字符串包含判断”转向结构化匹配。包装错误时可以保留上下文，同时不丢失底层错误类型。库代码也能通过暴露 sentinel error 或具体错误类型，给调用方稳定的判断入口。

### 3. Ed25519 加入标准库

`crypto/ed25519` 提供 Ed25519 签名算法。它常见于现代身份认证、签名校验和密钥体系，API 比传统椭圆曲线组合更直接：

```go
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
sig := ed25519.Sign(priv, msg)
ok := ed25519.Verify(pub, msg, sig)
```

这类 API 的价值是把算法组合隐藏在明确动作后面。调用方不需要自己选择哈希函数、曲线参数和签名编码细节。

### 4. 模块下载链路更完整

Go 1.13 强化了 `GOPROXY`、`GOSUMDB`、版本验证和 `go env -w` 等能力。模块不仅要能下载，还要能校验、缓存、复现，并能在企业网络和私有仓库环境里明确配置行为。

`go env -w` 让 Go 环境配置可以写入 Go 自己的配置文件，例如 `GOPROXY`、`GOSUMDB`、`GONOSUMDB`。这比依赖 shell profile 更稳定，也方便工具读取当前 Go 命令实际看到的配置。

## 语言与规范

Go 1.13 放宽数字字面量写法：可以写 `0b1010`、`0o755`，也可以用 `_` 分隔数字。这个变化不大，但对二进制位、权限位、长整数和测试数据都更友好。

## 工具链与运行时

模块系统继续前进。`go env -w` 可以持久化环境变量，`GOPROXY`、`GOSUMDB` 等变量让模块下载和校验更明确。`go get` 的版本验证也更严格，减少非规范版本号带来的歧义。

运行时和编译器主要做性能与平台支持改进，包含 AIX、Android、Darwin、FreeBSD、Illumos、Windows 等端口变化。

## 标准库与新增包

新增公开包：

- `crypto/ed25519`：提供 Ed25519 签名算法。

关键 API：

- `errors.Is`、`errors.As`、`errors.Unwrap`：标准化错误链检查。
- `fmt.Errorf` 支持 `%w`：创建可展开的包装错误。
- `crypto/tls` 默认启用 TLS 1.3。
- `strconv`、`math/big` 等包支持新的数字字面量风格。

## 小版本特殊变化

Go 1.13 系列共有 15 个小版本，重点集中在 HTTP、安全加密、macOS 分发和 runtime 稳定性。

这一系列里，`net/http` 和 `net/textproto` 的安全修复要放在一起看：HTTP 本质上大量依赖文本头解析，换行、空白、分隔符和大小写处理不一致，都可能造成代理和后端对同一请求理解不同。`crypto/x509` 修复继续围绕证书验证边界。`encoding/binary` 的安全问题虽然不如 HTTP 显眼，但它常用于解析协议字段和二进制文件，边界检查错误可能放大到上层解析器。

- `go1.13.1` 修复 `net/http` 和 `net/textproto` 安全问题。
- `go1.13.2` 同时涉及 compiler 和 `crypto/dsa` 安全修复。
- `go1.13.4` 处理 macOS 10.15 Catalina 下 Gatekeeper 拒绝未 notarize 安装器和二进制的问题。
- `go1.13.7` 和 `go1.13.13` 都包含 `crypto/x509` 相关安全修复，后者还包含 `net/http` 安全修复。
- `go1.13.15` 修复 `encoding/binary` 安全问题。这个包看起来底层，但它常出现在协议和二进制格式解析路径里。
- 多个小版本反复修 runtime、linker、`go` 命令和 `net/http`，说明 1.13 的新错误链和模块能力之外，工程稳定性仍是主线。

## 参考

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

