go get 报 checksum mismatch 是模块校验失败,非网络问题,主因是 go.sum 哈希与实际 zip 包内容不匹配,源于本地缓存损坏、代理返回污染包或上游强制覆盖 tag;首选解法为 go clean -modcache + 删除 go.sum + go mod tidy 重建校验。

go get 报 checksum mismatch 不是网络问题,是校验失败
这个错误不是因为你连不上 GitHub 或 GOPROXY 配错了,而是 go.sum 里存的哈希值和实际下载下来的模块 zip 包内容对不上。本质是「校验失败」,不是「下载失败」。常见诱因有三个:本地模块缓存损坏、代理返回了污染/滞后的包、上游作者强制覆盖了 tag(比如 v1.2.3 对应的代码被 git push --force 改过)。
清理缓存 + 重建 go.sum 是最有效解法
别手动删 $GOPATH/pkg/mod/cache 下某个子目录——容易漏删或删错。直接执行:
-
go clean -modcache:清空整个模块缓存,安全且彻底 - 删掉项目根目录下的
go.sum文件(推荐,避免旧哈希干扰) - 再运行
go mod tidy或go get -u <module></module>,让 Go 重新下载并生成新哈希
注意:go clean -modcache 不会影响 go.mod,也不会动你写的代码,只清第三方依赖缓存。
GOPROXY 返回污染包时怎么验证和绕过
国内常用代理如 https://goproxy.cn 有时会缓存旧版或被中间件篡改的包(比如企业内网 proxy 注入 license header),导致哈希必然不匹配。
- 临时切到直连验证:
GOPROXY=direct go get <module></module>(Linux/macOS)或set GOPROXY=direct && go get <module></module>(Windows) - 如果
direct成功,说明代理有问题;可换用GOPROXY=https://proxy.golang.org,direct,加,direct作兜底 - 某些内网 proxy 会重写 module zip,这种场景下必须禁用代理或换可信源
作者 force push tag 时唯一靠谱做法是锁 commit hash
这是最隐蔽的坑:有人把 v1.2.3 tag 指向的代码库内容直接 push --force 覆盖了,而 Go 的 checksum 是按 zip 包算的,内容一变哈希就崩。此时 go.sum 里存的是旧哈希,但新 zip 已不可逆。
- 查
go.sum中该模块对应行,确认哈希不匹配 - 运行
go mod download -json <module>@v1.2.3</module>看它实际解析到哪个 commit - 若确认是作者违规操作,放弃 tag,改用 commit 锁定:
go get <module>@a1b2c3d</module>(取自go mod download -json输出里的Version字段)
tag 被覆盖后,靠清理缓存或换代理都救不回来——哈希冲突根源在上游,不是你本地或网络的问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











