go mod download卡在TLS握手超时主因是默认直连sum.golang.org和proxy.golang.org导致丢包,应设GOSUMDB=off跳过校验并配GOPROXY=https://goproxy.cn,direct实现加速与保底回源。

go mod download 卡在 TLS 握手超时怎么办
不是网络慢,是 go mod download 默认直连 sum.golang.org 和 proxy.golang.org,国内环境常因丢包导致 TLS 握手卡 5–10 秒,表现为命令光标不动、无输出、最终超时失败。
直接解决方式是关掉校验和服务器并换代理:
-
GOSUMDB=off:跳过 checksum 校验(开发阶段安全可接受,CI 阶段应恢复) -
GOPROXY=https://goproxy.cn,direct:国内镜像加速模块拉取,direct保底回源 - 临时生效:运行
GOSUMDB=off GOPROXY=https://goproxy.cn,direct go mod download - 永久生效:写入 shell 配置,如
echo 'export GOSUMDB=off' >> ~/.zshrc
go build 因依赖扫描反复触发下载怎么破
改一行代码后 go build 又卡住,大概率不是编译慢,而是 go list 扫描过程中触发了隐式 go mod download——尤其当 go.mod 里有 replace 指向本地路径或私有 Git 地址时,Go 会尝试解析远程模块元数据。
关键控制点:
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 加
-mod=readonly:禁止任何自动修改go.mod或触发隐式下载 - 避免在
go.mod中写裸replace github.com/foo/bar => ../bar,改用相对路径或明确版本号 - 检查
go env GOMODCACHE是否可写,权限问题会导致缓存失效后退回到网络拉取 - 执行
go mod verify看是否报 checksum mismatch,若有,说明本地缓存已损坏,需go clean -modcache && go mod download
内网/弱网环境下如何让 go build 完全不碰网络
测试开发阶段若无法稳定联网,又不想每次手动 go mod vendor,可用组合策略实现“一次准备,多次离线构建”:
- 先在有网机器上跑
go mod download && go mod vendor,生成完整vendor/目录 - 把整个项目(含
vendor/)拷到目标机器,确保GOFLAGS=-mod=vendor已设置(或加到~/.zshrc) - 验证:运行
go build -v ./...,输出中不应出现go: downloading行 - 注意:
vendor/不会自动更新,后续新增依赖必须回到有网环境重新go mod vendor
go run 为什么总比 go build 卡,且不走缓存
go run 默认绕过 $GOCACHE,每次都在临时目录编译+运行,既不能复用缓存,也无法利用 -trimpath 提升命中率。丢包环境下它还会重复触发模块校验。
替代方案更可靠:
- 改用
go build -mod=readonly -trimpath -o /tmp/app ./cmd/app && /tmp/app - 把这行写成 alias,比如
alias gr='go build -mod=readonly -trimpath -o /tmp/app ./cmd/app && /tmp/app' - CI 或脚本中禁用
go run,统一用go build+ 执行两步 - 如果真要热重载,用
air但配置build_delay = 0并指定cmd = "go build -mod=readonly -trimpath -o bin/app ./cmd/app",避免它自己调go run
真正卡住的往往不是 Go 编译器,而是网络不可靠时工具链反复试探失败连接;关掉 GOSUMDB、锁死 -mod=readonly、用 vendor 切断对外依赖,三者叠加基本能消除所有非代码原因的卡顿。

















