direct是go内置关键字,表示当代理返回404或410时回源直连模块原始地址,必须置于goproxy链末尾且小写;搭配goprivate可解决私有模块拉取失败问题。

直接设 GOPROXY=https://goproxy.cn,direct 并配好 GOPRIVATE,95% 的“拉不到模块”问题当场消失。不是换源、改 hosts 或开代理软件的问题,是 Go 工具链根本没走对路。
为什么 go get golang.org/x/net 总是超时或 403
Go 默认只认 GOPROXY 环境变量,完全不读系统 HTTP 代理、浏览器设置或 hosts。它直连 https://proxy.golang.org,而这个地址在国内多数情况不可达。
- 错误做法:只设
GOPROXY=https://goproxy.cn—— 缺少,direct会导致私有模块(如gitlab.example.com)被强行转发到镜像站,结果 404 或 timeout - 正确写法必须带
direct关键字,且写在末尾:go env -w GOPROXY=https://goproxy.cn,direct - 验证是否生效:
go env GOPROXY输出应含goproxy.cn;再跑go list -m golang.org/x/net,毫秒级返回即成功
go mod download 卡住或报 checksum mismatch
卡住常因 DNS 解析慢或中间网关丢包,checksum mismatch 则多是本地缓存与镜像不同步,不是代码被篡改。
- 先清缓存:
go clean -modcache(这会删掉所有已下载模块,但能解决 70% 的校验误报) - 若仍失败,检查
go.mod是否残留replace指向本地路径但没删// indirect标记——这会让 Go 错误计算 checksum - 临时绕过单个模块校验:
go get -insecure github.com/xxx/yyy,但别设全局GOINSECURE=*,否则私有域名全跳过校验 - 企业内网建议同步配
GOSUMDB=off(测试环境)或指向内网校验服务(生产环境)
私有模块拉取失败:403、module lookup failed、unknown revision
一旦 GOPROXY 设为公共镜像,所有模块都会被转发过去,包括你公司 Git 域名下的私有库——结果就是 403 或解析失败。
- 必须用
GOPRIVATE显式排除私有域名:go env -w GOPRIVATE="git.company.com,github.com/my-org/*" - 通配符
*有效,但不支持正则;多个域名用英文逗号分隔,**不能有空格** - 若用 SSH 克隆,需确保
ssh -T git@git.company.com能通;若用 HTTPS,提前配好 Git 凭据,或设GIT_TERMINAL_PROMPT=0避免卡住 - IDE(如 VSCode、GoLand)可能读自己的环境变量,务必在 IDE 内置终端里也运行一遍
go env -w GOPROXY=...
最容易被忽略的是 direct 的位置和作用:它必须紧贴在最后一个代理地址后、用英文逗号连接,且不能被换行或空格截断;一旦缺失,所有非公开域名都会被强制转发到代理,而代理无法处理内网鉴权,直接报错。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











