go mod download卡在dial tcp: i/o timeout是代理未生效所致,根本原因是子进程未继承goproxy环境变量,或goproxy缺少,direct导致私有模块拉取失败、校验异常;必须配套配置goprivate并验证go mod download -x日志确认请求地址。

go mod download 卡在 dial tcp: i/o timeout 是代理没生效
不是网络差,是 go 进程根本没走你设的代理。常见现象:执行了 go env -w GOPROXY=https://goproxy.cn,direct,但 go mod download 日志里仍出现 GET https://proxy.golang.org/。
原因有二:
- Shell 环境变量未导出(如只改了
go.env但没运行export GOPROXY=...),子进程启动时读不到,fallback 到默认值 - IDE(VS Code、GoLand)或 CI 环境未重载环境变量,配置“写入成功”但未被继承
验证是否真生效:运行 go mod download -x github.com/gin-gonic/gin@v1.9.1,看输出里请求的是 https://goproxy.cn/ 还是 https://proxy.golang.org/。
GOPROXY=https://goproxy.cn 后面必须跟 ,direct
漏掉 ,direct 是高频翻车点,尤其项目含私有模块时——比如公司 GitLab 地址 git.example.com/internal,不加 ,direct 就会强制走代理查这个地址,结果 404 或 checksum mismatch。
,direct 的作用是:对匹配 GOPRIVATE 的模块路径,跳过代理直连 Git 服务器。
所以必须配套设置:
- 先运行
go env -w GOPRIVATE=git.example.com/internal(多个用逗号分隔) - 再设
go env -w GOPROXY=https://goproxy.cn,direct - 若私有域名带端口(如
git.example.com:8080),GOPRIVATE必须显式包含端口
checksum mismatch 不是网速问题,是校验链断了
报这个错时别急着换源,大概率是缓存污染或代理透传异常。goproxy.cn 和阿里云镜像本身会透传官方 sum.golang.org 记录,但某些自建代理若漏配 GOINSECURE 或跳过校验,就会返回错误哈希。
排查步骤:
- 执行
go clean -modcache清空本地缓存 - 临时关校验调试:
GOSUMDB=off go mod download(仅调试用,上线前必须恢复) - 检查是否误设了
GOINSECURE范围过大,导致本该校验的模块被跳过
刚发布的 tag(如 v1.2.3)在 goproxy.cn 返回 404?等 1–2 分钟,或临时切到 https://goproxy.io(注意:该站已停服,仅作极短时 fallback)。
go mod tidy 卡住不动,可能卡在校验阶段而非下载
它不只拉代码,还要去 sum.golang.org 校验哈希。这个域名在国内不可达,Go 工具链会反复重试、超时、再重试,看起来就是“卡住”。此时 ,direct 就成了关键保险——它让校验失败时自动 fallback 到直连模块源(如 GitHub)重新 fetch 并生成新 checksum。
如果你开了企业防火墙或中间代理:
- 确认
GOPROXY地址能被终端 curl 通(curl -I https://goproxy.cn) - 加
-v参数看具体卡在哪步:go mod tidy -v - 临时强制系统 DNS 解析:
go env -w GODEBUG=netdns=cgo,避开 Go 自带的纯 Go DNS(有时更慢)
真正拖慢整个流程的,往往不是“下载速度”,而是代理配置的完整性——GOPROXY 值、,direct、GOPRIVATE 三者缺一不可,漏掉任何一个,都可能让行为退回到默认代理,白配。











