go.sum 通过校验模块内容的 sha-256 哈希值防止依赖被篡改,每次下载或构建时比对实际哈希与记录值,不一致则报错中断;它动态更新、必须与 go.mod 一起提交,且涵盖所有传递依赖。

go.sum 是怎么防止依赖被偷偷换掉的
它不是“锁版本”,而是“验指纹”——每次 go mod download 或构建时,Go 会重新计算下载模块内容的 SHA-256 哈希值,和 go.sum 里存的比对。不一致就报错:verified sum mismatch,直接中断构建。
这意味着:哪怕你本地缓存里有个同名同版本的包,只要内容被篡改(比如镜像源劫持、代理污染、CI 构建机被植入恶意 patch),Go 就会拒绝使用它。
- 哈希基于模块根目录下所有 Go 源文件 +
go.mod文件内容生成,不含测试文件或无关文档 - 同一模块不同版本必然对应不同哈希;同一版本在不同机器上生成的哈希完全一致
- 如果模块没有
go.sum条目,首次下载时 Go 会自动写入;但后续任何内容变更都会触发校验失败
什么时候 go.sum 会被自动修改
go.sum 不是静态快照,它随依赖图变化而动态更新——但只在明确触发依赖变更操作时才改,不是每次 go build 都动它。
-
go get升级/降级某个模块 → 新增或替换对应行 -
go mod tidy清理未引用模块 → 删除对应行(谨慎!可能误删间接依赖的校验) - 手动编辑
go.mod后运行go mod download或go build→ 补全缺失哈希 - 注意:
go mod vendor不改go.sum,但vendor/目录本身不参与哈希校验
常见报错:sum mismatch 怎么快速定位
错误信息通常长这样:verifying github.com/some/pkg@v1.2.3: checksum mismatch,接着两行哈希值对比。这不是网络问题,是内容真实不一致。
立即学习“go语言免费学习笔记(深入)”;
- 先确认是否用了非官方代理(如 GOPROXY=direct)——某些国内镜像同步滞后或打过 patch
- 检查模块是否被本地
replace过:看go.mod里有没有replace github.com/some/pkg => ./local-fix,这种情况下go.sum记的是本地路径内容的哈希,换机器就崩 - 执行
go clean -modcache清空模块缓存,再go mod download重拉——排除本地缓存污染 - 别手动生成或编辑
go.sum行:哈希格式有固定结构(module/path v1.2.3 h1:xxx或go:sum),错一个字符就校验失败
go.sum 和 go.mod 必须一起提交吗
必须。缺 go.sum 的项目等于放弃依赖完整性保护——CI 构建、新同事拉代码、甚至你下周重装系统后 go build,都可能拿到被篡改的依赖。
-
go.sum文件体积小(通常几 KB)、无敏感信息、不包含逻辑,纯校验用途,没理由忽略它 - 如果项目用
go mod vendor,仍需保留go.sum:vendor 只解决分发问题,不替代校验 - 例外情况极少:极简 PoC 项目、临时脚本、或明确接受“不验证第三方代码”的离线嵌入式环境(但请确保你知道自己在放弃什么)
最常被忽略的一点:go.sum 里记录的是**所有传递依赖**的哈希,不只是你 go.mod 显式写的那些。这意味着即使你没动过依赖,别人升级了间接依赖,go.sum 也会变——别把它当成“可选配置”。










