go get 报 checksum mismatch 的根本原因是 go.sum 中的哈希值与实际下载包内容不一致,主要由本地缓存损坏、代理返回污染包或作者强制覆盖 tag 三类原因导致,需分别通过清缓存删 go.sum、切 direct 验证或改用 commit hash 锁定来解决。

go get 报 checksum mismatch 不是网络问题,是校验值对不上
这个错误不是连不上 GitHub 或代理配置错,而是 go.sum 里存的哈希值和实际下载下来的 zip 包内容不一致。常见诱因就三个:本地缓存损坏、代理返回了污染包、上游作者用 git push --force 覆盖了已发布的 tag。
先清缓存 + 删 go.sum,再重拉依赖
这是最常用也最有效的第一响应动作,别试图只删某个模块缓存——整仓清理才可靠:
- 运行
go clean -modcache,彻底清掉$GOPATH/pkg/mod/cache - 删除项目根目录下的
go.sum(保留go.mod) - 执行
go mod tidy或go get -u github.com/example/lib
注意:go clean -modcache 不影响你写的代码,也不动 go.mod,只是把所有已缓存的模块干掉,让 Go 重新下载并生成新校验值。
怀疑代理返回脏包?临时切 direct 验证
国内常用代理如 https://goproxy.cn 有时节点同步滞后或缓存被污染,会导致同一个 tag 下载出不同 zip:
- Linux/macOS 执行:
export GOPROXY=direct - Windows 执行:
set GOPROXY=direct - 再跑一次
go mod tidy
如果 direct 成功,说明问题出在代理;可换用 https://proxy.golang.org,或配置多源兜底:GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct。企业内网 proxy 若会重写 zip(比如注入 license header),必然触发校验失败,必须绕过。
作者强制覆盖 tag 时,go.sum 里的旧哈希永远对不上
这是最隐蔽的情况:有人把 v1.2.3 对应的代码库直接 push force 了,但没升版本号。Go 的校验和按 zip 算,内容一变,哈希就废了。
- 查
go.sum里对应行,看记录的是哪个 hash - 执行
go mod download -json github.com/example/lib@v1.2.3,看它实际指向哪个 commit - 确认是作者违规操作后,唯一办法是放弃 tag,改用 commit hash 锁定:
go get github.com/example/lib@abc1234
这种 case 无法靠清理或换代理解决,必须人工介入——因为旧哈希已经失效,且不可逆。别指望 go mod tidy 自动修复,它只会反复报错。

















