Go 1.27 标准库加入 uuid:NewV7 时间有序,替换 google/uuid 的常见场景
Go 1.27 把 uuid 包加进了标准库,实现 RFC 9562,覆盖生成、解析、格式化和比较,随机源是密码学安全的。带随机分量的 UUID 可以直接用 == 比较。
在此之前,github.com/google/uuid 是这个生态里事实上的标准,pkg.go.dev 上记录的已知导入者超过 100,000 个。新的顶层 uuid 包覆盖了常用核心功能,不需要再引外部模块。
NewV7:UUID 当数据库主键时用它
如果 UUID 是数据库主键,用 NewV7。Version 7 是时间有序的,生成的值大致按创建时间排序,插入 B-tree 索引时落在靠右的位置,而不是像 v4 那样散落到整个索引里。如果你见过一张用随机 UUID(v4)做主键的表写入吞吐下降,v7 就是为这个问题存在的。
整个 API 短到可以全列出来:NewV7、NewV4、Parse,以及 UUID 类型。带随机分量的 UUID 可比较。
与 google/uuid 的关系
标准库这层覆盖的是公共核心,不引入外部模块即可完成日常使用。原有依赖 github.com/google/uuid 的代码,按 API 对应关系替换即可。
Go 1.27 的其他变化
encoding/json/v2GA。现有的encoding/json现在由 v2 实现支撑,默认行为更严格:拒绝非法 UTF-8 和重复字段名。v1 增加了显式保留旧语义的选项,包括CallMethodsWithLegacySemantics、OmitEmptyWithLegacySemantics、FormatDurationAsNano、ParseTimeWithLooseRFC3339。crypto/mldsa:FIPS 204 后量子签名,提供 MLDSA44/65/87,并集成进crypto/x509和crypto/tls。- 按尺寸特化的分配路径降低了小对象(<80B)的分配开销,最多 30%;整体约 1%,二进制体积增加约 60KB。
链接
- Go 1.27 发布说明:https://go.dev/doc/go1.27
- Go 1.27 官方博客:https://go.dev/blog/go1.27
- uuid 包文档:https://pkg.go.dev/uuid