go mod download -x 显示真实 HTTP 请求,若卡住需检查 GOPROXY 是否生效、GO111MODULE 是否为 on、是否在 $GOPATH/src 下,并配合 GOSUMDB=off 或换源避免校验卡死。

go mod download -x 看真实请求地址
卡住时别猜,直接让 Go 把每一步网络请求打出来。执行 go mod download -x(加 -x 参数),输出里会逐行显示实际发起的 HTTP GET 请求。重点看有没有类似 GET https://goproxy.cn/github.com/gin-gonic/gin/@v/v1.9.1.info 这样的行——如果看到的是 GET https://proxy.golang.org/ 或者压根没输出、卡在某条 git clone 上,说明代理根本没生效或被绕过了。
常见陷阱:
-
go env GOPROXY显示正确 ≠ 实际生效;Shell 启动新进程时若没继承环境变量,go命令仍读空值 - IDE(如 VS Code)可能用自己独立的环境变量,终端里设好不等于编辑器里也生效
- 如果最后一行是
git -c core.autocrlf=false clone卡住,问题不在代理,而在 SSH key、Git 凭证或~/.ssh/configHost 别名不匹配
GOPROXY=direct 临时验证是不是代理问题
用 GOPROXY=direct go mod download -v 快速隔离:如果立刻失败(比如报 unknown revision 或 authentication required),说明网络本身通,问题出在代理配置或私有模块鉴权上;如果还是卡住或超时,那大概率是 DNS、TLS 握手或公司防火墙拦截了直连路径。
注意:GOPROXY=direct 是临时覆盖,不影响全局配置,适合单次诊断。但别长期这么用——它会让所有依赖走原始 Git 协议拉取,速度慢且不稳定。
立即学习“go语言免费学习笔记(深入)”;
关键点:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 必须带
-v才能看到模块来源和状态码 - 如果
direct模式下能成功,但默认代理模式卡住,基本锁定是GOPROXY地址不可达或 CDN 缓存未刷新(比如刚发布的 v1.2.3 在goproxy.cn上可能延迟 1–2 分钟才可见) - 某些企业内网 Git 服务要求 TLS 跳过校验,
direct模式下仍可能因证书失败卡住,此时需配合GIT_SSL_NO_VERIFY=1
GO111MODULE=on 和当前路径不能在 $GOPATH/src 下
哪怕 GOPROXY 设对了,GO111MODULE 是 auto 且你在 $GOPATH/src 目录下运行命令,Go 就会强制退回到 GOPATH 模式,完全忽略模块机制和代理设置——结果就是 go mod download 不执行、go get 报 cannot find module providing package。
确认方式:
- 运行
go env GO111MODULE,输出必须是on,不是auto或空 - 运行
pwd,确保当前路径不在$GOPATH/src内(哪怕只是子目录也不行) - 检查项目根目录是否有
go.mod;没有就先go mod init example.com/myapp
容易被忽略的是:VS Code 终端默认启动路径可能是用户主目录,而你手动 cd 进去的项目路径可能恰好是 $GOPATH/src 的子目录,此时 IDE 里跑命令照样失效。
GOSUMDB=off 或换源,避免校验阶段卡死
很多卡住不是下载慢,而是卡在 verifying github.com/xxx@v1.2.3: checksum mismatch 或反复重试 sum.golang.org。国内访问该域名极不稳定,Go 默认会等几十秒再 fallback,看起来像“不动”。
解法分两种:
- 开发环境可直接关校验:
go env -w GOSUMDB=off(注意:必须和GOPROXY=off配合使用才安全,否则只关校验不关代理,仍可能拉到篡改包) - 生产环境建议换源:
go env -w GOSUMDB=sum.golang.org+https://goproxy.cn/sumdb,但要注意goproxy.cn不提供自己的 sumdb 服务,此写法仅作占位,实际仍需确保sum.golang.org可达 - 更稳妥的是配对关闭:
go env -w GOPROXY=off且go env -w GOSUMDB=off,然后依赖离线缓存(见局域网场景)
真正麻烦的是:GOSUMDB 关了,但本地 go.sum 文件里已有旧 checksum,而你又换了代理源,导致新拉的模块哈希对不上——这时要删掉 go.sum 重跑 go mod tidy,而不是硬改文件。

















