Go模块下载慢的根本原因是proxy.golang.org国内不可用,需正确配置GOPROXY=https://goproxy.cn,direct、GOPRIVATE覆盖私有路径,并确保所有子进程(含IDE/CI)继承该环境变量,缺一不可。

Go模块依赖下载慢,不是你网络差,而是proxy.golang.org在国内基本不可用——它不优化国内节点、易受DNS污染、TLS握手频繁超时。真正卡住的地方,往往不是“要不要换源”,而是GOPROXY是否被所有子进程正确读取、,direct是否启用、GOPRIVATE是否覆盖全部私有路径。漏掉任何一个,都可能让下载行为退回到默认代理。
go env -w GOPROXY=没生效?检查子进程是否继承环境变量
很多人执行了go env -w GOPROXY=https://goproxy.cn,direct,但go mod download仍连proxy.golang.org。这不是命令没运行成功,而是Shell启动新go进程时,若当前Shell的GOPROXY环境变量为空(比如只改了go env配置但没导出),go工具链就会fallback到默认值。
- 验证是否真生效:运行
go mod download -x github.com/gin-gonic/gin@v1.9.1,看日志里出现的是GET https://goproxy.cn/还是GET https://proxy.golang.org/ - IDE(如VS Code)或CI环境常不继承Shell环境变量,需在编辑器设置里单独配置
GOPROXY - Windows PowerShell用户设完后,务必重启终端;macOS/Linux用户建议把
export GOPROXY=https://goproxy.cn,direct写入~/.zshrc或~/.bash_profile并执行source
为什么必须加 ,direct?私有模块拉取失败的根源
,direct不是可选项,是兜底机制:当代理无法命中缓存时,自动跳过代理直连Git服务器。漏掉它,私有模块(如git.example.com/internal/*)会直接报not found或checksum mismatch。
-
GOPROXY=https://goproxy.cn,direct中的,direct不能省,逗号前后不能有空格 - 必须配套设置
GOPRIVATE,否则Go仍会尝试走公共代理查私有路径:go env -w GOPRIVATE=git.example.com/internal/* - 如果私有域名是泛域名(如
*.corp.example.com),GOPRIVATE不支持通配符,只能写具体前缀,例如git.corp.example.com,api.corp.example.com
checksum mismatch不是网速问题,先清缓存再查校验源
遇到checksum mismatch别急着换源,这通常不是网速问题,而是模块哈希校验失败,原因多与代理或缓存污染有关。
- 本地缓存污染是常见诱因:执行
go clean -modcache清空后再试 - 某些自建代理若漏配
GOINSECURE或跳过校验,会返回错误哈希;公开镜像如goproxy.cn和mirrors.aliyun.com/goproxy透传官方sum.golang.org记录,更可靠 - 临时调试可设
GOSUMDB=off,但上线前必须关掉——否则失去依赖完整性保护 - 刚发布的版本(如
v1.2.3)在goproxy.cn返回404,等1–2分钟或临时切到https://goproxy.io(注意该站已停服,仅作极短期fallback)
go get卡在dial tcp或DNS阶段?不是代码问题,是Go CLI行为
go run或go build卡在DNS或dial阶段,不是网络请求超时,而是Go工具链自身在解析模块路径或校验checksum时,底层net.Dial未设timeout,遇到DNS慢或中间网关丢包,可能阻塞数十秒甚至更久。
- 快速验证:执行
go mod download -x查看最后一条curl命令,复制出来手动跑,看是DNS还是connect超时 - 临时缓解:加
go env -w GODEBUG=netdns=cgo强制用系统DNS,避开Go自带的纯Go DNS解析器(有时更慢) - 根本解法:确保
GOPROXY可达,并在企业内网部署私有proxy(如Athens),避免对外依赖 - 自建
athens或goproxy服务启动失败导致超时,大概率是监听地址没暴露给Go CLI:确认服务监听的是0.0.0.0:3000而非127.0.0.1:3000(Docker或WSL场景下尤其关键)
真正卡住的点,从来不是“选哪个镜像站”,而是GOPROXY是否被所有上下文(终端、IDE、CI、子shell)一致读取,,direct是否启用,GOPRIVATE是否精确覆盖全部私有路径——这三个点,缺一不可。

















