Go模块下载慢的根本原因是默认代理proxy.golang.org在国内不可用,需同时满足三个条件:GOPROXY设为https://goproxy.cn,direct、GOPRIVATE覆盖私有路径、环境变量被子进程正确继承,缺一就会退回到默认代理导致超时或失败。

Go模块下载慢,不是你网络差,而是默认代理 proxy.golang.org 在国内基本不可用——DNS 污染、TLS 握手超时、连接复用失败频繁触发重试,表现就是 go mod download 卡在某个模块几秒不动,最后报 dial tcp: i/o timeout。真正起效的配置,不靠“多试几个镜像”,而在于三个关键点是否全部到位:环境变量是否被子进程继承、,direct 是否启用、GOPRIVATE 是否覆盖全部私有路径。
为什么 go env -w GOPROXY=... 设置后还是走 proxy.golang.org
很多人执行了 go env -w GOPROXY=https://goproxy.cn,direct,但 go mod download 日志里仍出现 GET https://proxy.golang.org/。这不是命令没运行成功,而是 Shell 启动新 go 进程时,没把该变量导出到子进程环境里。
- 验证方式:运行
go mod download -x github.com/gin-gonic/gin@v1.9.1,看日志中实际请求的是哪个地址 - 临时修复:在当前终端执行
export GOPROXY=https://goproxy.cn,direct(Linux/macOS)或$env:GOPROXY="https://goproxy.cn,direct"(PowerShell) - 持久生效:改完
go env -w后,必须重启终端或重新加载 shell 配置(如source ~/.zshrc),否则 IDE、CI 或后台任务仍读不到
,direct 为什么不能省,省了会怎样
GOPROXY=https://goproxy.cn,direct 中的 ,direct 是兜底策略,不是可选项。漏掉它,私有模块拉取就会失败。
- 现象:公司 Git 地址如
git.example.com/internal/lib报not found或checksum mismatch - 原因:
direct表示“对未匹配任何代理的模块,跳过代理直连”,没有它,Go 会强行把所有模块都扔给goproxy.cn,而该站无法处理 SSH 认证或内网 Git 的 Basic Auth - 注意:
direct必须放在逗号分隔列表末尾,否则后续代理不会被尝试
私有模块拉不到?光设 GOPROXY 不够,还得配 GOPRIVATE 或 GONOPROXY
即使加了 ,direct,如果 Go 工具链不知道哪些域名是私有的,它仍会先去 goproxy.cn 查一遍,查不到才 fallback——这个“查”的过程本身就会失败或超时。
立即学习“go语言免费学习笔记(深入)”;
- 正确做法:先运行
go env -w GOPRIVATE=git.example.com/internal/*(推荐)或go env -w GONOPROXY=git.example.com - 两者区别:
GOPRIVATE同时影响代理行为和校验行为(自动跳过sum.golang.org校验),GONOPROXY只绕过代理,但校验仍走官方服务,容易因墙导致失败 - 多个域名用英文逗号分隔,不支持通配符,例如:
git.example.com,github.com/my-org
遇到 checksum mismatch 别急着换源
这通常不是网速问题,而是模块哈希校验失败。根本原因多与缓存污染或代理配置不当有关。
- 第一步:执行
go clean -modcache清空本地缓存,再重试 - 第二步:确认你用的镜像源是否透传官方
sum.golang.org记录——goproxy.cn和mirrors.aliyun.com/goproxy/都支持,但某些自建 proxy 若漏配GOINSECURE或跳过校验,就会返回错误哈希 - 临时调试可用
GOSUMDB=off,但上线前必须关掉;长期关闭等于放弃依赖完整性保护
最容易被忽略的点是:这三个配置项(GOPROXY 带 ,direct、GOPRIVATE、环境变量继承)必须同时成立,缺一不可。少一个,go mod download 就可能悄无声息地退回到默认代理,卡住、超时、404,全都回来了。


















