go get 报 404 是因默认代理 proxy.golang.org 不支持私有模块或已删 tag,且不自动回退到 direct;需设 goproxy 链式地址如“https://goproxy.cn,https://proxy.golang.org,direct”实现公私兼备。

为什么 go get 报 404 而不是连接超时
因为 Go 默认走的是官方代理 https://proxy.golang.org,但它不提供私有模块、被墙的仓库(比如 GitHub 上某些未公开的 fork)、或已删除/重命名的 tag —— 这些请求直接返回 404,而不是尝试换源。它不会自动回退到 direct,除非你明确配置了回退策略。
如何用 GOPROXY 同时支持公网模块和私有仓库
把多个代理用逗号拼成链式地址,Go 会从左到右依次尝试,直到成功或全部失败。关键是要把可信的国内镜像放前面,direct 放最后兜底:
GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct-
direct不是 URL,是 Go 内置关键字,表示直连原始模块地址(如github.com/user/repo) - 中间的
https://proxy.golang.org是可选的,加它是为了 fallback 到官方源(但注意:它仍不支持私有域名) - 别写成
https://goproxy.cn,direct—— 缺少中间代理时,一旦 goproxy.cn 返回 404(比如模块不存在),Go 就停了,不会继续试direct
遇到 invalid version: unknown revision 怎么办
这是 direct 模式下最典型的失败:Go 直连 Git 服务器拉代码,但目标 commit、branch 或 tag 在远端已不可见(删了、force push 覆盖了、权限变了)。这时光调 GOPROXY 没用,得检查:
- 模块路径是否拼错(比如
github.com/user/repo/v2少了个/v2) - 所依赖的
go.mod里写的require版本是否存在(git ls-remote origin看一眼) - 如果是公司内网 GitLab,确保
GOPRIVATE已设(例如GOPRIVATE=gitlab.example.com/*),否则 Go 会坚持走代理,根本不会触发direct
Windows 下设置环境变量容易漏掉的点
PowerShell 和 CMD 处理 GOPROXY 的语法不同,且新终端不会自动继承修改:
立即学习“go语言免费学习笔记(深入)”;
- PowerShell:用
$env:GOPROXY="https://goproxy.cn,direct"(注意双引号不能省,逗号是字面量) - CMD:用
set GOPROXY=https://goproxy.cn,direct(同样要引号,但 CMD 里常被忽略) - 临时生效后,务必运行
go env -w GOPROXY="https://goproxy.cn,https://proxy.golang.org,direct"持久化,否则关终端就丢 -
go env -u GOPROXY可清空,别手抖写成-w GOPROXY="",空字符串会让 Go 当作未设置,退回到默认值
GOPRIVATE 和 GOPROXY 是两套机制,一个管“哪些不走代理”,一个管“代理失败后怎么兜底”,混用时顺序和范围稍不留神就失效。










