内网执行 go mod download 卡住或报 connection refused,根本原因是 goproxy 默认指向 proxy.golang.org 且内网不可达;应设 goproxy=direct 并配 goprivate 和 gosumdb=off,确保模块路径、import、git url 全部字符级一致。

内网机器执行 go mod download 卡住或报 connection refused 怎么办
这不是 Go 安装失败,而是模块代理默认指向 proxy.golang.org,内网无法访问导致的阻塞。绕过方式不是“换镜像”,而是明确告诉 Go:别代理,直接走源——但前提是源本身可达。
- 临时验证:运行
go env -w GOPROXY=direct,再试go mod download;若仍失败,说明连私有 Git 服务器(如 GitLab)也 unreachable,需先排查网络连通性、SSH/HTTPS 认证、DNS 解析 - 长期方案必须配
GOPRIVATE:比如私有仓库域名是git.internal,就执行go env -w GOPRIVATE=git.internal,否则go get仍会尝试走公共代理 - 别漏掉
GOSUMDB=off:否则go build会在最后校验阶段连接sum.golang.org,同样超时;内网无校验服务时,必须关掉
go mod init 后 go mod tidy 找不到私有模块怎么办
根本原因不是网络问题,而是模块路径没对齐——Go 要求模块路径必须是带域名的完整 URL 格式,且和 import 语句、Git clone 地址严格一致。
- 初始化时就得用真实路径:
go mod init git.internal/team/project,不能写成go mod init project或go mod init ./project - 所有
import必须完全匹配:import "git.internal/team/utils",少一个斜杠或拼错字母都会失败 - 如果私有模块还没推送到 Git 服务器,先用
replace指向本地路径:replace git.internal/team/utils => ./internal/utils,但注意:./internal/utils目录下必须有合法go.mod,且其module声明也得是git.internal/team/utils
CI 构建机上 go build 失败,提示找不到 vendor 里的包
go mod vendor 不等于“把所有依赖打包进来”,它只处理当前模块 resolve 出的依赖树,且默认跳过测试依赖、replace 的本地路径、以及未被显式 import 的间接依赖。
- 构建前务必清理并重生成:
go mod tidy -v && go mod vendor -v;不加-v参数时失败静默,根本看不出缺了哪个包 - CI 环境要禁用代理:
GOPROXY=direct GOSUMDB=off go build,否则即使有vendor目录,Go 仍会尝试联网校验 - 检查
vendor/modules.txt是否包含目标包;如果缺失,说明该包没被任何.go文件 import,或者被build tag排除
用 athens 搭建内网代理,为什么 go get 还是走外网
配置代理地址只是第一步,GOPRIVATE 和 GOPROXY 必须协同生效——前者决定“哪些模块跳过代理”,后者决定“其余模块走哪下载”。两者缺一不可。
- 启动 athens 后,设置:
go env -w GOPROXY=http://athens-server:3000(替换为实际 IP),同时保留GOPRIVATE值,例如go env -w GOPRIVATE=git.internal,github.company.com - 别用
https://开头的GOPROXY值指向 HTTP 服务,会因协议不匹配直接 fallback 到 direct - 验证是否生效:
go env GOPROXY GOPRIVATE,输出应类似http://athens-server:3000和git.internal;再执行go get git.internal/team/utils@latest,观察日志里是否出现 athens 的请求记录
go mod init 的参数、Git 仓库 URL、import 字符串,到 replace 和 GOPRIVATE 的值,全部必须字符级精确匹配,差一个点或大小写,整个链路就断了。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











