必须同时设置GO111MODULE=on、GOPROXY=https://goproxy.cn,direct和GOSUMDB=sum.golang.google.cn三个环境变量,缺一不可;仅配GOPROXY不够,否则go mod tidy仍会因模块模式未启用或校验失败而慢或失败。

直接配置 GOPROXY 环境变量就能解决,不需要改代码、不用动 go.mod,也不依赖本地缓存是否干净。
为什么 go mod tidy 还是慢或失败?
根本原因不是模块本身大,而是 Go 默认会尝试直连 golang.org/x/、GitHub 等境外源。哪怕你只拉一个 golang.org/x/net,也会卡在 DNS 解析或 TCP 握手阶段。国内用户常见报错包括:Get "https://proxy.golang.org/...": dial tcp 216.58.200.46:443: i/o timeout 或 failed to fetch。
镜像站的作用是把远端模块缓存并提供 HTTPS 接口,Go 工具链完全无感——它只认 GOPROXY 返回的 JSON 响应格式,和官方 proxy 协议一致。
必须设置的三个环境变量
仅靠 GOPROXY 不够,缺一不可:
立即学习“go语言免费学习笔记(深入)”;
-
GO111MODULE=on:强制启用模块模式,否则go mod tidy可能退化为 GOPATH 模式,绕过代理 -
GOPROXY=https://goproxy.cn,direct:优先走七牛云镜像,失败时 fallback 到直连(direct是关键字,不能写成https://direct) -
GOSUMDB=sum.golang.google.cn:校验包哈希值的数据库,国内可用;若设为off会跳过校验,不推荐
执行命令一次性写入(Mac/Linux):
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
go env -w GO111MODULE=on<br>go env -w GOPROXY=https://goproxy.cn,direct<br>go env -w GOSUMDB=sum.golang.google.cn
Windows 用户用 PowerShell 执行相同命令即可,CMD 需换成 go env -w GOPROXY="https://goproxy.cn,direct" 加双引号。
遇到私有仓库怎么办?
比如公司内网 Git 地址 git.internal.company.com/mylib,如果被 GOPROXY 拦截,会返回 404 或认证错误。这时必须用 GONOPROXY 显式排除:
go env -w GONOPROXY=git.internal.company.com
多个域名用逗号分隔,支持通配符:go env -w GONOPROXY="*.internal.company.com,192.168.1.0/24"。注意:GONOPROXY 和 GOPRIVATE 不同——后者影响的是 go get 的认证逻辑,而 GONOPROXY 决定是否走代理。
验证是否生效的最简方法
别等 go mod tidy 跑完,用这个命令看请求路径:
GODEBUG=goproxylookup=1 go list -m github.com/spf13/cobra@v1.8.0 2>&1 | grep 'proxy='
输出里出现 proxy=https://goproxy.cn 就说明走对了。如果还看到 proxy=https://proxy.golang.org,说明环境变量没生效或被 shell 配置覆盖(比如 ~/.zshrc 里有旧的 export GOPROXY=... 冲突)。
真正容易被忽略的点是:VSCode 的终端可能没加载最新环境变量,重启 VSCode 或在它的集成终端里手动 source ~/.zshrc 才行;CI/CD 流水线也要单独配置环境变量,不能只在本地设。

















