go mod download卡住或报404主因是GOPROXY未正确配置,须设为https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct并配GOPRIVATE处理私有模块。

国内直接执行 go mod download 卡住或报 404,99% 是 GOPROXY 配置错——不是网络问题,而是 fallback 链写法、direct 位置、私有域名隔离三者之一没对。
为什么 go mod download 会卡住或返回 404
Go 1.13+ 默认走代理下载模块,但默认值 GOPROXY=https://proxy.golang.org,direct 在国内基本不可用:https://proxy.golang.org 常超时或拒绝连接,而 Go 不会自动重试,而是直接失败并返回错误(如 go: github.com/xxx: Get "https://proxy.golang.org/": dial tcp ...: i/o timeout)。更隐蔽的问题是:如果只配一个镜像(比如 https://goproxy.cn)且没加 direct,一旦该镜像暂未同步某个模块(返回 404),Go 就停止尝试,不再 fallback,结果就是硬报错。
-
GOPROXY必须是逗号分隔的列表,不能只写一个地址 -
direct必须小写、必须在末尾、前面不能有空格 - 多个代理之间**不能有空格**,否则 Go 解析失败,等效于没设
- 第一个代理返回 404(模块未缓存)→ 继续试第二个;全部返回非网络错误(404/503)→ 才走
direct
GOPROXY 多级 fallback 的正确写法
推荐配置(经长期验证稳定):
go env -w GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct
说明:
立即学习“go语言免费学习笔记(深入)”;
-
https://goproxy.cn:七牛云镜像,响应快、同步及时、支持sumdb代理 -
https://mirrors.tuna.tsinghua.edu.cn/goproxy/:清华镜像,作为二级兜底,覆盖部分 goproxy.cn 暂未收录的模块 -
direct:仅当所有代理都失败时才直连 Git 仓库(适用于公开可访问的 GitHub/GitLab 等)
别用 https://proxy.golang.org 单独兜底——它不缓存私有模块,且在国内几乎不可达;也别省略 direct,否则 404 就中断。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
私有模块必须配 GOPRIVATE,否则会泄露凭证
如果你的模块托管在公司内网 Git(如 git.internal.company.com/my/pkg),而 GOPROXY 又没排除它,Go 会把请求转发给公共代理,可能把 SSH key 或 HTTP token 暴露出去。
- 运行
go env -w GOPRIVATE=git.internal.company.com(支持通配符,如*.company.com) - 这样 Go 会跳过代理,直连该域名,且默认不校验 checksum
- 若仓库用 HTTP(非 HTTPS),再加
go env -w GOINSECURE=git.internal.company.com - 若模块不在官方 checksum DB(如纯内网包),再加
go env -w GONOSUMDB=git.internal.company.com
注意:GOPRIVATE 值必须和实际域名完全匹配,大小写敏感;配置后,go mod download 对该域名下的模块将完全绕过 GOPROXY 和 GOSUMDB。
怎么确认配置真正生效
别信 shell 配置文件是否 reload,也别信 IDE 缓存——最准方式只有一条命令:
go env GOPROXY
输出必须是你设的完整字符串,例如 https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct。如果还是 https://proxy.golang.org,direct,说明:
- Linux/macOS:改完
~/.zshrc后没source,或终端没新开 - Windows PowerShell:用
$env:GOPROXY=...只作用于当前会话,永久设置必须走「系统属性 → 环境变量」图形界面 - IDE(如 GoLand):可能缓存旧值,需重启;或项目启用了
go.workworkspace mode,会覆盖全局设置
复杂点在于:GOPROXY、GOPRIVATE、GONOSUMDB、GOINSECURE 四者必须协同生效,漏一个就可能触发权限错误或校验失败——尤其是 GOPRIVATE 没配全时,go get 报 “github.com 用户权限不足” 很可能是私有域名被代理了。

















