GOPROXY必须配置为多级fallback且以,direct结尾,否则私有模块会404或校验失败;需配合GOPRIVATE、GONOPROXY和GONOSUMDB隔离私有仓库,并双写go env -w与shell环境变量确保终端和IDE生效。

GOPROXY 必须设成带 direct 后缀的地址,否则私有模块会 404 或 checksum mismatch。
go env -w GOPROXY= 是最简方式,但不保证终端和 IDE 都生效
执行 go env -w GOPROXY=https://goproxy.cn,direct 会写入 Go 的全局配置,对大多数命令行场景有效。但它不等于系统环境变量——比如 macOS 图形界面启动的 GoLand,可能根本没继承 shell 的 GOPROXY,只读这个配置项;而某些 CI 脚本或旧版工具链又可能只读环境变量。
- 推荐双写:先运行
go env -w GOPROXY=https://goproxy.cn,direct,再在 shell 配置里加export GOPROXY=https://goproxy.cn,direct(Linux/macOS 加到~/.zshrc,Windows PowerShell 加$env:GOPROXY="https://goproxy.cn,direct") - 改完后新开终端窗口验证:
go env GOPROXY输出必须是完整字符串,不能是空或off - 别信“设了就自动生效”——GoLand 的 Settings → Go → Go Modules 页面里有个 Environment 输入框,它会覆盖系统级
GOPROXY,务必填成和终端一致的值
为什么必须加 ,direct?
direct 不是可选项,它是 fallback 机制开关。没有它,Go 会在代理返回 404 时直接报错,而不是尝试直连原始仓库。
- 私有模块如
git.internal.company.com/my/lib不在镜像站缓存中,代理必然 404;没direct就卡死 - 新发布的模块(比如刚 push tag 的
v1.2.3)可能 CDN 还没同步,direct让 Go 自动退到 GitHub 直连 - 写成
https://goproxy.cn单独一个地址,等同于https://goproxy.cn,https://proxy.golang.org,后者在国内基本不可用,反而拖慢失败路径
私有模块要额外配 GONOPROXY 和 GONOSUMDB
只靠 direct 不够。如果私有模块需要校验 sum,而你又没让 Go 知道“这地址别走代理、也别查官方 sum”,就会触发 checksum mismatch 错误。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
立即学习“go语言免费学习笔记(深入)”;
- 执行
go env -w GONOPROXY=git.internal.company.com,github.com/my-org和go env -w GONOSUMDB=git.internal.company.com,github.com/my-org,两个值必须完全一致 - 域名必须精确匹配,
*.company.com不生效,git.internal.company.com/internal/*中的/*也不被识别,只认前缀匹配 - 改完必须重启 GoLand,否则 Settings 页面和 Terminal 可能仍用旧缓存值
验证代理是否真在用,别只看 go env
go env GOPROXY 只告诉你“写了啥”,不是“用了啥”。真实请求路径得靠日志抓。
- 在终端运行
go list -m -u all -v,观察输出里有没有https://goproxy.cn/开头的请求路径;如果卡在proxy.golang.org或sum.golang.org,说明代理根本没走 - 更细粒度:加
GODEBUG=goproxylookup=1 go list -m github.com/sirupsen/logrus,输出里会明确打印 “proxy lookup for … viahttps://goproxy.cn” - 遇到
go mod tidy卡住超过 10 秒不动,大概率是代理未命中 + fallback 失败,立刻Ctrl+C检查,别干等
最容易被忽略的是 direct 这个尾巴,以及 GoLand Settings 页面里那个悄悄覆盖环境变量的 Environment 输入框——它们不显眼,但一漏就全盘失效。

















