go get 报 checksum mismatch 是校验失败而非网络问题,因 go.sum 哈希值与实际模块内容不符;应先运行 go clean -modcache 清缓存、删 go.sum,再执行 go mod tidy;若代理污染可切 goproxy=direct 验证;遇 tag 被强制覆盖时需改用 commit hash 锁定版本。

go get 报 checksum mismatch 不是网络问题,是校验失败
这个错误不是因为你连不上 GitHub 或 GOPROXY 配错了,而是 go.sum 里存的哈希值和实际下载下来的模块内容对不上。Go 会拒绝加载,因为这可能意味着:模块被上游篡改、代理返回了污染包、本地缓存损坏,或者作者用 git push --force 覆盖了已发布的 tag。
先清缓存再重建 go.sum 最有效
别试图删 $GOPATH/pkg/mod/cache/github.com/xxx 下某个子目录——整仓清理才可靠:
- 运行
go clean -modcache,清掉所有缓存模块 - 删掉项目根目录下的
go.sum(推荐,避免旧记录干扰) - 再执行
go mod tidy或go get -u github.com/some/module
go clean -modcache 不影响 go.mod,也不会动你写的代码,但能解决 80% 以上的校验失败。
怀疑代理返回了脏包?临时切 direct 验证
国内常用 https://goproxy.cn,但某些节点可能缓存了旧版或被重写过的内容(比如企业内网 proxy 注入 license header 就必然触发 mismatch):
- Linux/macOS 执行
export GOPROXY=direct;Windows 用set GOPROXY=direct - 再跑一次
go mod tidy,如果成功,说明代理有问题 - 可换为多源兜底配置:
GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct
作者强制覆盖了 tag?只能用 commit hash 锁定
这是最隐蔽的情况:v1.2.3 tag 对应的代码被 push force 替换了,go.sum 里还是旧哈希,但新 zip 已不可逆。此时:
- 查
go.sum中该模块行,找到旧 hash - 运行
go mod download -json github.com/some/module@v1.2.3,看它实际指向哪个 commit - 确认后,放弃 tag,改用 commit:
go get github.com/some/module@abcd123
commit hash 是唯一且不可变的,比语义化版本更可靠——尤其当你依赖的库维护不规范时,这点容易被忽略。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











