Go模块下载慢主因是默认代理https://proxy.golang.org国内不可达,应设GOPROXY为https://goproxy.cn,direct并配合GOPRIVATE处理私有模块。

国内拉取 Go 模块慢,不是网络问题,而是默认代理不可达。 你执行 go mod tidy 卡在 golang.org/x/net 或 google.golang.org/grpc,大概率不是本地网速差,而是 Go 默认用 https://proxy.golang.org,这个地址在国内多数环境无法直连——它不被 DNS 污染,而是被策略性拦截,超时后也不自动 fallback,直接卡死。
为什么 go env -w GOPROXY 必须设成逗号分隔
Go 的代理机制支持链式 fallback,但只认逗号(,),不认空格或分号。设成 https://goproxy.cn 单一地址,一旦该镜像临时不可用(比如维护、限流),整个 go get 就失败;而 https://goproxy.cn,direct 表示:先走镜像,失败后立刻直连原始源(前提是能通)。实测中,七牛云和 goproxy.cn 偶发 503,direct 能救急。
-
go env -w GOPROXY=https://goproxy.cn,direct是最稳的组合 - 阿里云镜像
https://mirrors.aliyun.com/goproxy/可作备选,但注意末尾斜杠不能少,否则返回 404 - 避免用已停服的
https://goproxy.io(2024 年底起返回 404)
内网或私有模块必须配 GOPRIVATE
如果你拉的是公司 Git 仓库里的私有模块(如 git.internal.company.com/go/utils),即使设置了 GOPROXY,Go 仍会尝试走代理——结果 404 或 401。这时必须显式告诉 Go:“这些域名跳过代理”。
- 执行
go env -w GOPRIVATE=git.internal.company.com(多个用逗号隔开) - 若域名带子路径,如
git.internal.company.com/team/project,只需写根域git.internal.company.com,Go 会自动匹配前缀 -
GOPRIVATE不影响校验,GOSUMDB仍会验证 checksum,私有模块需确保go.sum已存在或关闭校验(不推荐)
go mod download 卡住时别硬等,先查缓存和连接
go mod tidy 卡住 2 分钟以上,大概率不是下载慢,而是 DNS 解析失败或 TLS 握手卡住。别反复 Ctrl+C 重试,先快速定位:
立即学习“go语言免费学习笔记(深入)”;
- 运行
go env GOCACHE,进该目录看是否有大量.lock文件残留——有就删掉,Go 的模块缓存锁有时不释放 - 手动测试代理连通性:
curl -v https://goproxy.cn/github.com/gin-gonic/gin/@v/v1.9.1.info,看是否返回 JSON;如果超时,说明代理地址本身不通 - 临时关掉 Windows Defender 实时保护(尤其 Home 版本),它曾多次误杀
go.exe进程导致模块下载中断
真正麻烦的不是配错一行命令,而是把 GOPROXY 和 GOPRIVATE 当成独立开关——它们必须协同生效。一个漏设,就可能让 go build 在 CI 上突然失败,而本地却正常。每次换新机器或重装系统,都要重新核对这两项,不是仪式感,是刚需。


















