goproxy与gosumdb必须匹配,如设goproxy=https://goproxy.cn却未配gosumdb=sum.golang.org+https://goproxy.cn,会导致checksum mismatch卡住;需检查二者是否成对、direct回退、goprivate私有域名、系统代理及hosts劫持,并区分connection refused与timeout根因。

检查 GOPROXY 和 GOSUMDB 是否匹配
国内拉不到模块,90% 是 GOPROXY 设了镜像但 GOSUMDB 没同步配对。比如设 GOPROXY=https://goproxy.cn 却没设 GOSUMDB=sum.golang.org+https://goproxy.cn,go mod download 就会卡在 checksum mismatch。
实操建议:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 运行
go env GOPROXY GOSUMDB看两者输出是否成对;GOSUMDB=off仅限开发调试,上线前必须关掉 - 私有模块场景下,GOPROXY 必须含
direct回退,例如GOPROXY=https://goproxy.cn,direct - 若用公司内网 Git(如
git.example.com),还需加go env -w GOPRIVATE=git.example.com
确认系统代理没被 Git 或 shell 残留劫持
Go 的 http.Client 默认继承系统代理,而 git config --get http.proxy 输出的 http://127.0.0.1:7890 这类本地代理,常导致 go get 连自己都连不上——报错是 connection refused,但根本不是 Go 代码问题。
实操建议:
- 查 Git 代理:
git config --get http.proxy,非空则执行git config --unset http.proxy - 查环境变量:
env | grep -i proxy,尤其注意HTTP_PROXY、HTTPS_PROXY、NO_PROXY - 临时清空测试:
HTTP_PROXY= HTTPS_PROXY= NO_PROXY= go mod download golang.org/x/net
验证 /etc/hosts 是否静默重定向域名
hosts 文件里一行 127.0.0.1 goproxy.cn 就能让所有 go mod 请求打到本地空端口,错误仍是 connection refused,但你根本想不到是 hosts 在作祟。
实操建议:
- Linux/macOS 查
/etc/hosts,Windows 查C:\Windows\System32\drivers\etc\hosts - 搜索
goproxy、proxy.golang.org、sum.golang.org等关键词,临时注释掉相关行 - 改完后不用重启,直接
go mod download -v golang.org/x/net测试是否恢复
区分 connection refused 和 timeout 的真实含义
很多人看到 connection refused 就去调 Go 代码,其实它只说明“目标地址+端口没人监听”,和超时完全不同:前者是服务端明确拒收,重试无意义;后者才值得等一等再试。
实操建议:
- 先用
curl -v https://goproxy.cn或nc -zv goproxy.cn 443确认网络层通不通 - Go 代码里别用字符串匹配判断错误,要用类型断言:
if urlErr, ok := err.(*url.Error); ok && strings.Contains(urlErr.Err.Error(), "connection refused") - 若确认是拒绝,优先排查代理、hosts、DNS,而不是改
go build参数或重写 HTTP client
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










