国内用户应配置 goproxy=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,https://goproxy.cn,direct,因 proxy.golang.org 在国内不稳定且不支持 404 fallback,而 direct 必须置于末尾才生效,多镜像加 direct 可提升下载成功率与容错性。

国内用户不配代理,go mod download 十有八九卡住或报 404/timeout;Go 1.21+ 默认 GOPROXY=https://proxy.golang.org,direct,但这个组合在国内基本不可用——proxy.golang.org 访问不稳定,且它不支持对 404 的 fallback,direct 不会触发。
为什么 go get 或 go build 会卡在 downloading 阶段
这不是网络连不上,而是 Go 工具链按顺序尝试代理失败后,没走到 direct 就提前退出了。典型现象:go: downloading github.com/some/pkg@v1.2.3: reading https://goproxy.cn/github.com/some/pkg/@v/v1.2.3.info: 404 Not Found,命令直接失败,不会继续试下一个地址或 fallback 到 direct。
-
404、503等 HTTP 错误不会触发 fallback,只有连接超时(dial tcp: i/o timeout)或拒绝(connection refused)才会轮到下一个代理 -
direct必须放在逗号分隔列表的末尾,写成GOPROXY=https://goproxy.cn,direct才有效;写成direct,https://goproxy.cn会导致先直连、再代理,反而更慢 - 单个镜像(如只设
https://goproxy.cn)风险高:CDN 缓存未命中、证书更新、上游同步延迟都会导致 404,且无兜底
推荐的 GOPROXY 配置写法(含 fallback 逻辑)
国内环境建议用至少两个独立镜像 + direct,顺序不能错:
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
go env -w GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,https://goproxy.cn,direct
- 清华源响应快、元数据完整(支持
go list -m -json),适合作为主代理 - 七牛云源(
goproxy.cn)作为二级兜底,覆盖部分清华未及时同步的模块 -
direct必须小写、无协议、无空格、置于末尾——它是最后手段,仅对公开可直连仓库(如 GitHub)生效 - 不要加空格:
https://goproxy.cn , direct是无效的,Go 解析失败后会退回到默认值
企业内网或 CI 环境必须禁用 direct
防火墙通常拦截 direct 的出向连接,此时留着它反而导致构建失败。正确做法是移除 direct,只保留可信代理,并提前验证:
go env -w GOPROXY=https://my-goproxy.internal.company.com
- 运行
go mod download -x查看每一步是否都命中代理,有没有漏掉的私有模块域名 - 私有模块(如
git.internal.company.com/mylib)需额外设GOPRIVATE=git.internal.company.com/*,否则 Go 仍会试图转发给公共代理 - 若私有 Git 用 HTTP 协议,还得加
GOINSECURE=git.internal.company.com;若校验和数据库不包含私有模块,再补GONOSUMDB=git.internal.company.com/*
验证代理是否真生效,别只信 go env 输出
go env GOPROXY 显示值 ≠ 实际生效值。常见干扰项:
- PowerShell 里用
$env:GOPROXY="..."只影响当前会话,重启终端就失效;Windows 必须通过「系统属性 → 环境变量」图形界面设永久变量 - IDE(如 GoLand)可能缓存旧配置,改完要重启 IDE,或执行
go clean -modcache清掉本地缓存 - 项目根目录存在
go.work或go.mod时,某些工具链会优先读取文件内配置,绕过全局GOPROXY - 最可靠验证方式:
go mod download -x github.com/gin-gonic/gin@v1.9.1,看日志里实际请求的是哪个 URL
代理配置看着简单,真正踩坑的地方都在 fallback 触发条件、私有域名白名单、以及 IDE 和 shell 环境的缓存一致性上——别跳过 -x 日志验证这一步。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










