go模块下载慢的根本原因是默认代理proxy.golang.org在国内不可用,需配置goproxy=https://goproxy.cn,direct并配套设置goprivate,同时确保环境变量被子进程继承、,direct不省略、私有路径全覆盖,否则仍会fallback至默认代理。

Go模块下载慢,不是你网络差,而是默认代理 proxy.golang.org 在国内基本不可用——它不优化节点、易受 DNS 污染、TLS 握手频繁超时,表现就是 go mod download 卡在某个模块几秒不动,最后报 dial tcp: i/o timeout。
为什么 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 到默认值 - 某些 IDE 或终端会话未重载环境变量,导致配置“看似生效实则无效”
- 验证是否真生效:运行
go mod download -x github.com/gin-gonic/gin@v1.9.1,看日志里出现的是GET https://goproxy.cn/还是GET https://proxy.golang.org/
GOPROXY=https://goproxy.cn,direct 中的 ,direct 不能省
省掉 ,direct 是常见坑点,会导致私有模块(如公司 Git 地址)拉取失败:
-
,direct表示:对匹配GOPRIVATE的模块(如git.example.com/internal/*),跳过代理直连 Git 服务器 - 必须配套设置
GOPRIVATE,否则 Go 仍会尝试走公共代理查私有路径,报not found或checksum mismatch - 示例:先运行
go env -w GOPRIVATE=git.example.com/internal/*,再设GOPROXY
遇到 checksum mismatch 别急着换源
这通常不是网速问题,而是模块哈希校验失败,原因多与代理或缓存有关:
-
goproxy.cn和mirrors.aliyun.com/goproxy透传官方sum.golang.org记录,但某些自建代理若配置不当(比如漏配GOINSECURE或跳过校验),会返回错误哈希 - 本地缓存污染也会触发该错:执行
go clean -modcache清空后再试 - 临时调试可设
GOSUMDB=off,但上线前必须关掉——否则失去依赖完整性保护 - 刚发布的版本(如
v1.2.3)在goproxy.cn返回 404,等 1–2 分钟或临时切到https://goproxy.io(注意:该站已停服,仅作临时 fallback)











