Go 1.27 工具链:go fix 添 4 个 modernizer,GODEBUG 写成旧值会直接报错
go fix 新增 modernizer
go fix 增加了几个 modernizer:atomictypes、embedlit、slicesbackward、unsafefuncs。跑法不变:
go fix ./...
这些改写会落到源码上,升级后先看一遍 diff 再提交。
go doc 支持 package@version
go doc 可以直接查指定版本的包文档:
go doc example.com/pkg@v1.2.3
排查依赖版本行为差异时不用再切到对应 module 缓存目录。
go mod tidy 合并 require 块
go mod tidy 现在会把 go.mod 里多个 require 块自动合并成标准的两块结构:direct 与 indirect。
go mod tidy
如果之前手工拆过 require 块来分组,这部分结构会被重排。
GODEBUG:已移除设置的处理
自 Go 1.27 起,go 命令会识别出现在 go.mod(godebug 条目)和 .go 源文件(//go:debug 注释)中的、支持已被移除的 GODEBUG 设置:
- 如果这些设置被设成移除前确立的最终默认值,接受;
- 如果设为旧值,go 命令失败。
这是为了兼容保证:现有程序即使所设 GODEBUG 支持已移除,也能继续构建运行。升级后如果构建在 godebug 条目上折了,把它改成该设置移除前的最终默认值即可。
traceback 头部带 goroutine 标签
go 指令配置为 Go 1.27 及以上的模块,其 traceback 头部现在包含 runtime/pprof goroutine 标签。可在运行时关闭:
GODEBUG=tracebacklabels=0 ./app
该设置在 Go 1.26 加入,预计长期保留,以防 goroutine 标签含敏感信息。
编译器:size-specialized 内存分配
编译器现在生成对 size-specialized 内存分配例程的调用,把小于 80 字节的小对象分配成本降低最多 30%,对分配密集程序整体提升约 1%,二进制增大约 60KB(与负载无关)。构建时可临时关掉:
GOEXPERIMENT=nosizespecializedmalloc go build ./...
该 opt-out 预计 Go 1.28 移除。