go get卡住或报404主因是GOPROXY未正确配置,需设为国内镜像如https://goproxy.cn,direct;私有模块还需同步配置GOPRIVATE和GONOSUMDB,否则仍会校验失败或认证错误。

go get 卡住或报 404,大概率是 GOPROXY 没配对
Go 1.21+ 默认 GOPROXY=https://proxy.golang.org,direct,但国内访问 proxy.golang.org 基本不可用——不是超时就是 403,direct 在这种情况下不会自动触发,命令直接失败。你看到的 go: downloading github.com/some/pkg@v1.2.3: reading https://proxy.golang.org/...: 404 Not Found 就是典型症状。
- 必须显式覆盖为国内可用镜像,不能依赖默认值
-
direct必须保留,且必须放在代理列表末尾,否则私有模块(如git.corp.example.com/mylib)会直接 404 - 推荐配置:
go env -w GOPROXY=https://goproxy.cn,direct——七牛云源同步快、校验全、中文支持好 - 别写成
GOPROXY=https://goproxy.cn(缺,direct),也别加空格,比如"https://goproxy.cn, direct"会导致解析失败
私有模块拉不下来?GOPROXY 只是第一关,还得配 GONOSUMDB 和 GOPRIVATE
即使 GOPROXY 配了 ,direct,私有仓库仍可能报 checksum mismatch 或 unauthorized。因为 Go 还会去 sum.golang.org 校验哈希,而私有模块不在那里存记录;同时,某些 Git 地址(如 https://gitlab.internal/foo/bar)默认被代理拦截,根本没机会直连。
- 告诉 Go 别校验私有模块:
go env -w GONOSUMDB="gitlab.internal,github.com/myorg/*" - 告诉 Go 别走代理,直接连这些地址:
go env -w GOPRIVATE="gitlab.internal,github.com/myorg/*" - 如果私有库用 SSH(
git@gitlab.internal:foo/bar.git),确保~/.ssh/config里 Host 配置正确,go不读git config的sshCommand -
GOPRIVATE和GONOSUMDB的值要严格对齐,否则一个跳过代理、一个坚持校验,照样失败
临时调试或 CI 脚本里怎么安全覆盖 GOPROXY?
不想改全局配置,或者想验证某个镜像是否真有效,可以用命令前缀临时覆盖。这种方式干净、隔离、可复现。
- 当前终端生效:
GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct go mod download - CI 脚本中推荐写法(Bash / Zsh):
GOPROXY=https://goproxy.cn,direct go build -o app . - 注意:Windows PowerShell 里不能用这种前缀写法,得用
$env:GOPROXY="https://goproxy.cn,direct"再执行,且仅限当前会话 - 别在脚本里混用
go env -w和临时变量,容易污染后续步骤
验证 GOPROXY 真生效了没?别只看 go env
go env GOPROXY 输出正确 ≠ 实际生效。IDE 缓存、shell 配置未重载、甚至 go.work 文件都可能让环境变量“看起来对、实际错”。
立即学习“go语言免费学习笔记(深入)”;
- 先清缓存:
go clean -modcache - 再触发一次真实下载:
go mod download github.com/spf13/cobra@v1.8.0 - 观察输出里是否出现
Fetching https://goproxy.cn/github.com/spf13/cobra/@v/v1.8.0.info—— 出现了才算真正走代理 - 如果还看到
proxy.golang.org,检查~/.zshrc或~/.bashrc是否有旧的export GOPROXY=...覆盖了你刚设的值
最常被忽略的是:direct 不是“备选代理”,而是“最后兜底行为”,它必须小写、无协议、放末尾;而私有模块相关配置(GOPRIVATE/GONOSUMDB)一旦漏掉一个,就可能卡在 checksum 或 401 上,跟代理本身无关。










