编程 Go 1.27 把 JSON 拆成两层:encoding/json/v2 与 encoding/json/jsontext

2026-09-27 21:02:49

Go 1.27 把 JSON 拆成两层:encoding/json/v2 与 encoding/json/jsontext

Go 1.27(2026-08-19 发布)往标准库里加了两个包,加上原有的 encoding/json,现在有三条路径可选。

两个新包的分工

  • encoding/json/v2:高层 JSON 处理。带可配置选项,默认行为比老包更严格。
  • encoding/json/jsontext:底层流式处理,token 级。

分工大致是「配置化编解码」和「自己拉 token」两档。你只关心把结构体转成 JSON,用 json/v2;要按 token 处理、或者不想让库做整体缓冲,走 jsontext。

老的 encoding/json 怎么办

不用动 import 路径。已有的 encoding/json 内部现在由 v2 实现支撑,反序列化更快,同时保持向后兼容——Go 1 promise。这是这次改动里最关键的一点:换成 v2 内核,但没有破坏老代码。

真正的迁移注意点在于「更严格的默认行为」这一条。如果新起的代码直接 import encoding/json/v2,拿到的就是新默认值;继续用 encoding/json 则维持老行为。两边不要在同一份解码逻辑里混着用同一套假设。

同版本的语言改动

  • 泛型方法:method 可以声明自己的类型参数,例如 math/rand/v2 新增 (*Rand).N[Int intType](Int) Int。接口方法不能声明类型参数,也不能被泛型方法实现。
  • struct literal 的 key 现在可以是任意合法字段选择器,能直接初始化嵌套/内嵌结构体字段。
  • 函数类型推断推广到所有赋值场景:复合字面量、类型转换、channel send。

工具

  • go fix 新增现代化器:atomictypes、embedlit、slicesbackward、unsafefuncs。
  • go doc 支持 package@version 查询,例如 go doc example.com/pkg@v1.2.3。
  • go mod tidy 自动把多个 require 块合并成 direct/indirect 两块。

性能与运行时

size-specialized 内存分配让小于 80B 的小对象分配成本最多降 30%,分配密集程序整体约 1% 提升,代价是二进制增大 ~60KB。想关掉用 GOEXPERIMENT=nosizespecializedmalloc,1.28 预计移除该开关。

goroutineleak profile 转正,位于 runtime/pprof,HTTP 端点是 /debug/pprof/goroutineleak。

其它标准库

  • crypto/mldsa:FIPS 204 后量子签名,已接入 crypto/x509、crypto/tls。
  • uuid 包:原生生成/解析 UUID。
  • simd 与 simd/archsimd,需要 GOEXPERIMENT=simd。
  • net/http/httptest 新增 NewTestServer:内存假网络,配合 testing/synctest 使用。
  • net/http 的 Server 新增 HeaderValueCount / DefaultMaxHeaderValueCount。

GODEBUG

go 命令现在会识别那些已移除支持的 GODEBUG 设置——go.mod 里的 godebug 条目、源码里的 //go:debug。如果设的值恰好等于移除前的最终默认值,接受;设成旧值则直接失败。

这条升级时会立刻撞上:老项目里留着的 //go:debug 指令,值一旦不是最终默认值,构建就会报错。

复制全文 生成海报 Go 1.27 encoding json v2 jsontext

推荐文章

程序员茄子在线接单