检查 Go 版本升级
提升 go.mod 中的 go 行不仅会改变语言版本。每个主包都会获得新版本的 GODEBUG 默认值,因此 net/http、crypto/tls、crypto/x509、net/url、runtime 等包的行为可以在没有代码更改的情况下发生变化。该内置工具通过已安装的 Go 工具链查询哪些默认值发生了变化,以及哪些二进制文件导入了受影响的包。它需要已安装 Go,仅读取 go.mod 而不编辑它,从不构建或运行用户的代码,也从不使用网络。
运行工具
在模块根目录下执行,或传入模块目录:
go run "${CLAUDE_PLUGIN_ROOT}/scripts/godebugdiff.go" --to 1.24 .
--to默认为已安装工具链的版本,且不能比它更新。如果用户想要更新的目标,请告知他们需要先安装该 Go 版本。--from默认为当前的go行。如果要审查已升级的 PR,请传入基础分支的版本:--from 1.21。- 添加
--json以获取结构化输出,添加--tests以包含测试二进制文件。没有主包的模块会通过其测试二进制文件自动检查。 - 如果提示模块不在模块缓存中,请在运行前询问是否执行
go mod download,因为这会使用网络。
检查每项变更是否到达二进制文件
该工具按读取设置的包列出设置。导入包并不意味着使用了更改的代码路径,因此请检查:
- 阅读设置的文档说明和链接。然后在代码中搜索它命名的 API,例如:
httpmuxgo121的http.NewServeMux和HandleFunc模式- TLS 设置的
tls.Config - x509 设置的
x509.ParseCertificate或CreateCertificate randseednop的rand.Seed
- 针对每项设置,说明代码是否使用了该路径:已使用、未使用、或无法判断(例如依赖项调用了它)。
runtime设置(如containermaxprocs和updatemaxprocs)适用于每个二进制文件。指出那些对部署方式重要的设置,例如带有 CPU 限制的容器。- 以
win开头的设置仅影响 Windows。如果项目不部署在 Windows 上,请说明。 - “更改 go 命令”下的设置影响
go test -json或 CI 中的构建,而非程序本身。
报告
- 一个简短表格:设置、变更内容、涉及哪些二进制文件、以及代码是否使用该路径。
- 建议采用新默认值或固定旧行为。仅对代码真正依赖的设置建议固定,并使用工具的
godebug ( ... )块。固定是临时性的:说明它们会在后续 Go 版本中被移除。 - 传递工具的注释,例如 Go 1.22 的循环变量变化,或者库的
go行不会为导入它的程序设置 GODEBUG。
不要
- 除非用户要求,否则不要编辑
go.mod。 - 不要因为列表为空就说升级是安全的。该工具仅覆盖 GODEBUG 默认值。发布说明中列出了其他更改。
- 除非用户要求,否则不要运行用户的测试或二进制文件来检查行为。