Go模块下载卡住是网络或代理配置问题,需设GOPROXY=https://goproxy.cn,direct、GOPRIVATE排除私有域名、GOSUMDB=sum.golang.google.cn,并清理缓存go clean -modcache。

go mod download 卡在 dial tcp 或 context deadline exceeded
这不是代码或模块本身的问题,而是 Go CLI 在解析域名或建立 TCP 连接时被阻塞。常见于 DNS 污染、中间网关丢包、或代理地址不可达。
- 先验证是否是 GOPROXY 不可达:运行
curl -I https://goproxy.cn,看能否快速返回200 OK - 若
curl也超时,说明网络或防火墙拦截了该地址;若成功但go mod download仍卡住,大概率是 Go 自带 DNS 解析器(netdns=go)在某些环境响应慢 - 临时强制用系统 DNS:执行
go env -w GODEBUG=netdns=cgo,再试一次 - 根本解法不是换 DNS,而是确保
GOPROXY地址能稳定访问——国内推荐https://goproxy.cn,direct,清华源已停更,不建议再用
GOPROXY=direct 导致私有模块拉取失败
设成 GOPROXY=direct 看似“绕过问题”,实则把所有模块都切回直连,私有 GitLab、内部 git.company.com 或 GitHub 私仓会因认证缺失或域名不可达直接报 403 或 module lookup failed。
- 正确做法是保留
,direct作为 fallback,而不是全量关闭代理:例如go env -w GOPROXY=https://goproxy.cn,direct - 私有域名必须加进
GOPRIVATE:如go env -w GOPRIVATE="git.company.com,github.com/my-org/*" - 多个域名用英文逗号分隔,**不能有空格**;通配符
*只支持末尾,不支持正则 - 如果用 SSH 克隆,还需确认
ssh -T git@git.company.com能通;HTTPS 方式则要提前配置 Git 凭据
go get 安装 gopls/dlv 等工具仍超时
go get 在 Go 1.16+ 已被标记为废弃,它默认绕过 GOPROXY,尤其对 golang.org/x/... 路径的工具,会直连 golang.org,而该域名在国内基本不可达。
- 改用
GO111MODULE=on go install:例如GO111MODULE=on go install golang.org/x/tools/gopls@latest - 若仍失败,可临时替换模块路径(仅调试):把
golang.org/x/tools改成github.com/golang/tools,但需同步改代码中 import 路径 - 更稳妥的是配好
GOPROXY后,再加go env -w GONOPROXY="git.company.com",避免私有域名被代理转发 - 注意:VS Code 或 Goland 的终端可能读取独立环境变量,务必在 IDE 内终端也执行一遍
go env -w GOPROXY=...
校验阶段卡住或 checksum mismatch
下载完成后,Go 会默认访问 sum.golang.org 校验模块哈希值。这个地址被墙后,Go 会反复重试,导致 go mod tidy 卡在 verifying ... 阶段,或报 checksum mismatch。
立即学习“go语言免费学习笔记(深入)”;
- 临时验证是否为此原因:运行
go env -w GOSUMDB=off(仅限开发机,切勿提交或长期开启) - 清理污染缓存:
go clean -modcache,然后重试go mod download - 若报
zip: not a valid zip file,说明某模块缓存损坏,直接删掉对应路径即可(如$GOPATH/pkg/mod/cache/download/github.com/some/pkg/@v/xxx.zip) -
GOSUMDB=off是诊断手段,不是解决方案;长期应确保GOPROXY支持校验(goproxy.cn支持),而非关闭校验
GOPROXY + GOPRIVATE,再清缓存,最后验证是否所有终端(包括 IDE)都读取到新配置。漏掉任意一环,都可能看起来“配了但没用”。


















