go.mod和go.sum是跨系统依赖一致性的唯一依据,前者锁定模块路径与依赖版本,后者校验每个依赖的哈希值确保未被篡改;必须全局启用go111module=on并配置goproxy=https://goproxy.cn,direct,路径操作须用path/filepath.join避免硬编码。

go.mod 和 go.sum 是唯一需要同步的文件
跨系统依赖一致性的全部依据就在这两个文件里,其他任何东西(vendor/、GOPATH、本地 src/ 目錄)都不该进 Git,也不参与同步。
-
go.mod声明了模块路径和所有直接/间接依赖的精确版本号 -
go.sum记录每个依赖的校验和,防止篡改或拉取到不同 commit - 只要这两个文件存在且未被手动修改,执行
go mod download就能在 macOS/Linux/Windows 上还原完全一致的依赖树 - 别把
vendor/提交进仓库——它不包含标准库、不锁定 Go 版本、也不能还原gopls或dlv,CI 和他人拉代码后仍要跑go mod download
GO111MODULE=on 必须全局启用
模块模式一旦关闭,Go 会退回到 GOPATH 模式,导致路径解析行为在 Windows(大小写不敏感 + 反斜杠)和 Linux/macOS(大小写敏感 + 正斜杠)上出现不一致,甚至 panic。
- 执行
go env -w GO111MODULE=on,确保所有平台都强制启用模块 - 验证方式:运行
go env GO111MODULE,输出必须是on,不是空或auto - 如果 CI 或某些旧脚本里显式设置了
GO111MODULE=off,得直接改脚本,不能靠“环境里默认开”来赌 - 项目初始化第一行命令必须是
go mod init example.com/myapp,绝不能用./myapp这类本地路径
GOPROXY 配置影响依赖拉取成功率
国内机器若没配代理,go mod download 卡住、超时、报 unknown revision 是常态,而且错误提示模糊,容易误判为网络或模块本身问题。
- 统一执行
go env -w GOPROXY=https://goproxy.cn,direct,阿里云镜像稳定,direct后缀保证私有仓库直连 - 避免设成
https://proxy.golang.org——国内访问极慢,且不支持directfallback - 如果团队用私有 registry(如 Nexus、JFrog),需额外加
GOINSECURE或配置~/.netrc,但这些属于 infra 层配置,不应写死在项目里 - 检查是否生效:
go env GOPROXY输出应明确包含goproxy.cn,不是direct或空
路径拼接和文件操作必须用 path/filepath
硬编码 "conf/config.yaml" 或 "cmd\main.go" 在跨系统构建时会出错——Windows 用反斜杠,Linux/macOS 用正斜杠,而且大小写敏感性不同。
- 一律用
path/filepath.Join("conf", "config.yaml"),它会自动适配当前 OS 的分隔符 - 读取配置、打开文件、遍历目录时,优先用
os.ReadFile、os.ReadDir等抽象层,避免直接调os.Open加硬编码路径 -
.gitignore中要排除bin/、pkg/,但必须保留go.mod和go.sum—— 它们才是跨平台可复现性的锚点 - 别信“我本地能跑”,拉完代码后立刻执行
go mod verify,它会比对go.sum和实际下载内容,发现不一致马上中断
go.mod 的信任不足、对 GO111MODULE 的开关意识模糊、以及对路径字符串的随意处理。只要守住这三条线,Windows 上写的代码,Linux 上构建,macOS 上调试,就不会出现“依赖不一样”这种低级但高频的问题。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











