go111module=on是硬性前提,必须执行go env -w go111module=on;goproxy须设为https://goproxy.cn,direct;go mod init后必须立即执行go mod tidy;私有模块需配置goprivate。

GO111MODULE=on 是硬性前提,不是可选项
Go 1.16+ 虽默认启用 Modules,但旧终端、CI 镜像、Docker 容器或未刷新的 shell 仍可能卡在 GO111MODULE=auto 或 GO111MODULE=off。一旦触发,go mod 命令直接失效,go build 报错 no required module provides package 或 not in a module。
必须执行:
go env -w GO111MODULE=on
这不是“建议”,而是所有后续操作生效的基础。不设这个,go mod init 生成的 go.mod 可能被忽略,go get 不写入依赖,go mod tidy 直接报错。
常见误判点:
-
GO111MODULE=auto会根据当前路径是否在GOPATH/src下判断是否启用模块——比如你在/tmp/myapp下执行go mod init,它可能拒绝识别为模块 -
GO111MODULE=off彻底退化回 GOPATH 模式,go get不生成go.mod,所有依赖管理功能归零
GOPROXY 必须配国内镜像,否则 go mod tidy 卡死
默认 GOPROXY=https://proxy.golang.org 在国内基本不可用,go mod tidy 或 go get 常卡在 dial tcp: i/o timeout,流程中断。
正确配置命令:
go env -w GOPROXY=https://goproxy.cn,direct
direct 很关键:它表示对匹配 GOPRIVATE 的域名(如公司内网 Git)跳过代理,直连拉取;没有它,私有模块会因 401/404 失败。
验证是否生效:
go env GOPROXY
输出应为 https://goproxy.cn,direct,而不是空值或默认地址。
go mod init 后必须立刻 go mod tidy
go mod init example.com/myweb 只生成空的 go.mod,不下载任何依赖,也不校验 import 是否存在。此时直接 go run main.go 极大概率失败——缺间接依赖、版本不一致、甚至标准库外的包根本没拉下来。
go mod tidy 才是真正干活的命令:
- 扫描全部
import语句,补全直接 + 间接依赖 - 自动写入
require行到go.mod,同步更新go.sum - 删掉手动编辑加进去的
require行(别手改go.mod) - 已有
vendor目录时,默认不清理冗余内容;需加-v参数:go mod tidy -v
私有模块不配 GOPRIVATE 就会 401/404
没设 GOPRIVATE 时,Go 会把 git.internal.company.com/lib/foo 当作公共模块,走 GOPROXY 拉取,结果要么 404(找不到),要么 401(认证失败),报错类似:
reading git.internal.company.com/lib/foo/go.mod: 401 Unauthorized
设置方式:
go env -w GOPRIVATE="git.internal.company.com,github.com/myorg"
支持通配符:
go env -w GOPRIVATE="*.company.com"
如果私有仓库用 SSH 协议(如 git@git.internal.company.com:lib/foo.git),还需配 Git URL 重写:
git config --global url."git@git.internal.company.com:".insteadOf "https://git.internal.company.com/"
真正容易被忽略的不是命令怎么敲,而是环境变量的生效范围——go env -w 写入的是用户级配置,某些 CI 环境或容器里 shell 并不加载它,得在构建脚本开头显式设置。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











