截至 11 月 1 日,Go 最新稳定版是 1.27.3(10 月 19 日发布),1.27 正式版在 8 月 19 日出。Go 没有 LTS,官方只维护最近两个大版本,1.25 已经停止维护。升级时最容易踩的坑,跟新特性一点关系都没有。
1.27.3 是一次安全重建
它修的是 crypto/x509 根证书信任链问题:8 张已确认私钥失陷的中间 CA 证书被硬编码进拒绝列表。关键在于这份名单是编译进二进制的。只把构建机上的 Go 升到 1.27.3 再 go build 一遍不够,必须用新版本全量重新编译并重新部署,否则线上二进制里还是旧名单。
所以升级顺序是:构建机、CI Runner、镜像基础包全部切到 1.27.3,然后全量重建镜像与二进制,滚动发布。改 go.mod 里那行 go 指令不会触发任何运行时修复。
泛型方法:语言层最大的表达力补齐
1.18 引入泛型时,只有接收者能带类型参数,方法本身不能。结果是很多本该是方法的东西只能写成包级函数,链式调用彻底没法用。
1.27 放开了这个限制。语义上,接收者的类型参数决定“我在哪个类型上”,方法的类型参数决定“这次调用要什么类型”,两者不再互相绑架。标准库已经自己用上了:math/rand/v2 里原来按整数类型各写一遍的 Int32N、Int64N、IntN,收成一个带类型参数的 N 方法。
限制还在:接口方法仍然不能声明类型参数,泛型方法也不能用来实现接口。这是跨包编译效率的取舍。
标准库两个重头
encoding/json/v2 进了标准库,而且旧的 encoding/json 底层现在跑的就是 v2 实现,升级后不改代码反序列化就变快了。但 v2 默认更严格:非法 UTF-8、重复的对象键名会直接报错,字段名匹配默认大小写敏感,nil 的 slice 与 map 序列化成 [] 与 而不是 null。这几条都可能让老代码在升级后行为变化。
uuid 也进了标准库,不再需要第三方包。
升级检查单
先跑完整测试,重点看 JSON 序列化相关的用例;再 grep 一遍依赖重复键名或大小写不敏感匹配的代码;最后确认 CI 镜像里的 Go 版本与本地一致。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。