必须配置goproxy fallback至direct,否则私有模块拉取失败;goprivate需显式声明域名以防止凭证泄露,并配合goinsecure/gonosumdb处理http或校验问题。

go env -w GOPROXY 必须带 fallback,direct 不能省
只写一个代理地址(比如 https://goproxy.cn)会导致 go mod download 卡住或报 404——不是网络问题,是 Go 没机会 fallback 到 direct。Go 1.21+ 默认值 https://proxy.golang.org,direct 在国内基本不可用,得手动覆盖。
正确写法(无空格、逗号分隔、direct 小写且在末尾):
go env -w GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct
- 第一个镜像返回
404(如未同步新模块),Go 自动试第二个;全部失败才走direct -
direct是兜底项,不是可选项;漏掉它,私有模块或未收录模块就彻底失败 - 别把
https://proxy.golang.org放最后——它不缓存私有模块,且在国内响应极慢甚至超时中断
GOPRIVATE 必须显式声明,否则凭证会泄露
如果你的私有模块域名是 git.internal.company.com,但没配 GOPRIVATE,Go 会把请求原样转发给公共代理(比如 goproxy.cn),可能把 Git token 或 SSH 密钥暴露出去。
必须运行:
go env -w GOPRIVATE=git.internal.company.com
- 支持通配符:
*.company.com覆盖所有子域名 - 配了
GOPRIVATE后,Go 会跳过代理直连该域名,且自动跳过 checksum 校验 - 如果私有仓库用 HTTP(非 HTTPS),还得加:
go env -w GOINSECURE=git.internal.company.com - 如果模块没进官方校验库(比如内网自建包),再加:
go env -w GONOSUMDB=git.internal.company.com
私有代理(如 Athens/Nexus)要配 netrc + GOINSECURE
用 JFrog Artifactory 或 Nexus 做私有 Go proxy,go get 报 401 或 403 不是权限没开,是 Go 工具链根本不会自动传 Basic Auth 凭据。
解决方法只有两个:
- 在用户主目录建
~/.netrc,内容为:machine nexus.example.com<br>login admin<br>password apikey-xxx
- 同时确保
GOPRIVATE已包含该域名,否则 Go 会绕过.netrc直连 - 若用自签名证书或 HTTP,必须加
GOINSECURE,否则 TLS 握手直接失败 - 注意:JFrog 的 proxy URL 是
/artifactory/api/go/<repo-key></repo-key>,不是 UI 页面地址;Nexus 是/repository/<repo-name>/</repo-name>
验证配置是否生效,别信 shell 环境变量
很多人改了 ~/.zshrc 或 Windows 环境变量,却没生效——因为 Go 进程根本不读这些,只认 go env 写入的值。
最准验证方式,只有一条命令:
go env GOPROXY
- 输出必须是你设的完整字符串,比如
https://goproxy.cn,direct,而不是默认的https://proxy.golang.org,direct - IDE(如 GoLand)常缓存旧值,改完必须重启;Docker 构建中更得用
go env -w,export GOPROXY=完全无效 - 项目下有
go.work或启用了 workspace mode,也会覆盖全局设置,需单独检查
真正容易被忽略的是:私有模块的拉取行为取决于 GOPRIVATE 和 GOPROXY 的组合效果,而不是单个变量。漏掉任意一环,要么泄露凭证,要么 404,要么卡死不动——没有“差不多能用”这回事。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











