checksum mismatch 是因 go.sum 记录的模块 zip 包哈希与实际下载内容不一致,主因是本地缓存损坏、代理返回污染包或上游强制覆盖 tag;应先执行 go clean -modcache 并删除 go.sum,再运行 go mod tidy 重建校验和,必要时用 GOPROXY=direct 验证代理问题或改用 commit hash 锁定版本。

go get 报 checksum mismatch 不是网络问题,而是本地缓存或代理返回了内容不一致的模块包,必须清缓存 + 重生成校验和。
为什么会出现 checksum mismatch
Go 在 go.sum 中记录的是模块 zip 包的哈希值,不是源码 commit。一旦本地缓存损坏、代理节点返回旧版/污染包,或上游作者 git push --force 覆盖了已打 tag 的代码,就会导致下载下来的 zip 和 go.sum 里存的哈希对不上。
常见错误信息长这样:verifying github.com/beego/beego/v2@v2.3.5: checksum mismatch,后面跟着两行 downloaded: 和 go.sum: 的 h1:xxx 值明显不同。
- 别手动删
$GOPATH/pkg/mod/cache下某个子目录——容易删漏 - 别指望改
go.sum里的哈希值来“绕过”——Go 会拒绝加载 - 别反复试
go get -u—— 缓存没清,重试只是重复失败
快速修复三步操作
进入项目根目录(或 GOPATH 模块路径下),按顺序执行:
- 运行
go clean -modcache—— 彻底清空所有模块缓存 - 删除当前目录下的
go.sum文件 —— 避免旧哈希干扰重建 - 运行
go mod tidy—— 重新拉取依赖并生成全新go.sum
如果仍失败,临时切直连验证是否代理问题:
Linux/macOS:运行 export GOPROXY=direct
Windows:运行 set GOPROXY=direct
再跑一次 go mod tidy。成功则说明原代理(如 goproxy.cn)节点有滞后或污染。
代理配置建议与 commit 锁定兜底
国内推荐设为带 fallback 的链式代理:go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct
若确认是上游 force push 导致 tag 内容变更(查 go.mod 或 go sum -e 可见 commit hash 已变),只能放弃 tag,用 commit 锁定:go get github.com/beego/beego/v2@4a7b1d2(注意不带 v 前缀,也不加 ~ 或 +)
Beego v2 的模块路径必须是 github.com/beego/beego/v2,混用 github.com/astaxie/beego 会导致校验链断裂,哪怕只在某处 import 了一次也会污染整个模块图。
最易被忽略的一点:校验和失败常发生在 bee new 后首次 go mod tidy 时,此时项目刚初始化,go.sum 是空的但依赖声明已存在——直接 tidy 就可能触发中间态校验失败。务必先清缓存再 tidy,不要跳步。


















