必须改代理并验证全链路配置:先确认Go≥1.11、GO111MODULE=on、存在go.mod;再用go env -w GOPROXY=https://goproxy.cn,direct设置代理;私有模块需配GOPRIVATE;GOSUMDB建议设为off或换源;最后清缓存go clean -modcache。

go env GOPROXY 返回空或 proxy.golang.org 就说明通道断了
国内环境下,go env GOPROXY 如果输出空、direct 或仍是默认的 https://proxy.golang.org,direct,基本等于没通——这个地址在国内多数地区无法稳定建立 TLS 连接,go mod download 会卡在 dial tcp 超时或直接报错 Get "https://proxy.golang.org/...": dial tcp: i/o timeout。
验证方式很简单:go list -m -u all 或 go mod download -v,看是否卡在某个模块、是否有 Fetching 日志但无后续响应。
- 临时测试:运行
GOPROXY=https://goproxy.cn go mod download,成功就证明是代理配置问题,不是网络本身彻底不通 - 别信
curl https://goproxy.cn成功就等于 Go 能用——Go 会加额外 header 并走特定路径,必须用 Go 命令实测 - 如果
go env GOPROXY输出正确但依然失败,检查是否被 IDE(如 VS Code)环境变量覆盖,或终端 shell 配置未生效(比如改了~/.zshrc却没source)
三行命令重置代理并绕过校验阻塞
最简有效组合是同时设置 GOPROXY 和 GOSUMDB,避免因 checksum server 不可达导致的 verifying ... checksum mismatch 或静默失败。
执行以下命令(Linux/macOS):
立即学习“go语言免费学习笔记(深入)”;
go env -w GOPROXY=https://goproxy.cn,direct go env -w GOSUMDB=off go mod download
Windows PowerShell 用户把第一行换成:$env:GOPROXY="https://goproxy.cn,direct",第二行同理。
-
direct放在代理列表末尾,确保私有模块(如公司内网 Git)能 fallback 直连 -
GOSUMDB=off是临时手段,适合调试;生产环境更推荐保留校验,改用go env -w GOSUMDB=sum.golang.org+replace=gosum.io+ca=trusted(需确认可信) - 执行
go mod download后,再跑一次go build或go run,确认缓存已写入$GOMODCACHE(通常是$HOME/go/pkg/mod)
私有模块 403 或 module lookup failed?立刻配 GOPRIVATE
如果项目里用了 git.internal.company.com/my/lib 或 github.com/my-org/private 这类地址,而 go get 报 403 Forbidden 或 module lookup failed,大概率是 Go 仍试图把私有域名发给代理,被拦截了。
必须显式告诉 Go 哪些域名不走代理:
go env -w GOPRIVATE=git.internal.company.com,github.com/my-org go env -w GONOSUMDB=git.internal.company.com,github.com/my-org
-
GOPRIVATE和GONOSUMDB的值必须完全一致,否则校验阶段仍会失败 - 支持通配符,比如
github.com/my-org/*可覆盖整个组织下所有私有库 - 不支持
*通配顶级域名(如*.company.com),只能写具体前缀
go mod download 卡住不动?先清缓存再重试
有时代理换好了,go mod download 却卡在某个模块不动,甚至没日志输出——这往往是本地缓存损坏或旧版本残留导致的解析冲突。
不要硬等,直接清理后重来:
go clean -modcache go mod download
-
go clean -modcache会删掉整个$GOMODCACHE目录,释放磁盘空间,也清除了可能的坏 checksum 或中断下载的半成品 - 之后
go mod download会重新拉取所有go.mod中声明的模块,速度取决于代理和网络,但逻辑干净 - 如果项目较大,可加
-v参数观察进度:go mod download -v,看到Fetching行说明通道已通
真正麻烦的不是配错一行命令,而是配完没验证、或者混用 go env -w 和 export 导致优先级冲突。每次改完,务必用 go env GOPROXY 确认输出,再用 go mod download -v 看真实行为——Go 的模块系统不会撒谎,它只忠实地执行你告诉它的规则。


















