go mod download -x 是诊断代理配置问题的首选方法,它会打印真实 http 请求和 git 命令;据此可判断 goproxy 是否生效、gosumdb 是否协同、goprivate 是否遗漏私有域名,并排除 ide 环境变量未同步或 vendor 目录干扰等问题。

go mod download -x 看真实请求地址
卡死时别猜,先让 Go 吐出它到底在连谁。加 -x 参数能打印所有 HTTP 请求和 git 命令,这是最直接的证据链:
-
go mod download -x github.com/gin-gonic/gin@v1.9.1—— 观察输出里第一个GET行是https://goproxy.cn/...还是https://proxy.golang.org/...或直接git clone - 如果看到
proxy.golang.org,说明GOPROXY没生效(常见于 shell 环境变量未继承、IDE 未同步、或go env -w写错) - 如果看到
verifying github.com/xxx@v1.2.3: checksum mismatch,问题不在下载,而在校验阶段,得看GOSUMDB配置
GOPROXY 和 GOSUMDB 必须配对关/开
只关 GOPROXY 不关 GOSUMDB,Go 仍会尝试连 sum.golang.org 校验,照样卡死;只关 GOSUMDB 不换 GOPROXY,下载阶段就超时了。二者必须协同:
- 离线环境:执行
go env -w GOPROXY=off和go env -w GOSUMDB=off,缺一不可 - 内网有代理:设
GOPROXY=http://intranet-proxy:8080,同时设GOSUMDB=sum.golang.org+http://intranet-proxy:8080/sumdb - 用公开镜像(如 goproxy.cn):推荐
GOPROXY=https://goproxy.cn,direct,GOSUMDB可保留默认(它会自动 fallback 到镜像站的 sumdb)
私有模块没加 GOPRIVATE 就会 403 或 timeout
项目里用了 git.internal.company.com/my/lib 这类地址,但没告诉 Go “这是私有的”,它就会傻乎乎地把域名塞进 GOPROXY 地址里去请求,结果要么 403(代理无权限),要么 timeout(代理根本没法解析内网域名):
- 查
go.mod里所有非公开域名,比如replace、require中出现的git.example.com、github.com/my-org/private - 一次性全加进
GOPRIVATE:go env -w GOPRIVATE="git.example.com,github.com/my-org/*" - 注意:逗号分隔,**不能有空格**;通配符
*只支持后缀匹配,不支持my-org.* - 验证:
go env GOPRIVATE输出应与你设置的完全一致
GO111MODULE=on 和 vendor 目录会干扰代理
看似无关的两个配置,实际会让 Go 绕过代理机制:
-
GO111MODULE必须为on,不是auto或空值;go env -w GO111MODULE=on强制启用模块模式 - 项目根目录存在
vendor目录时,go build默认走 vendor,go mod download可能被跳过——删掉vendor或加-mod=mod强制走模块 - IDE(如 VS Code)可能读取独立环境变量,终端里
go env GOPROXY正确,但编辑器里仍是空值,需在 IDE 设置中单独配置
GOPROXY 写进了 shell profile,但 IDE 启动时没加载;或者 GOPRIVATE 漏了一个子域名,导致某个间接依赖悄悄触发了代理失败。动手前先 go mod download -x 看一眼真实行为,比反复改配置更省时间。











