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 指令,值一旦不是最终默认值,构建就会报错。