Go 1.16起go mod为默认且唯一推荐的包管理方式,通过go mod init初始化模块、go get引入依赖,并需正确配置GOPROXY和GOPRIVATE以解决国内或私有仓库拉取问题,go.sum不可删除以保障依赖完整性。

Go 1.16 之后,go mod 已成为默认且唯一推荐的包管理方式,不再需要第三方工具(如 dep、govendor)。直接用 go mod 就能完成依赖引入、版本锁定和构建隔离。
初始化模块:必须先有 go.mod 文件
在项目根目录下运行:
go mod init example.com/myapp其中
example.com/myapp 是模块路径(不一定要真实存在,但需符合 Go 模块命名规范)。这会生成 go.mod 文件,后续所有依赖操作都基于它。
常见错误:
• 在已有 vendor/ 目录下直接 go get,可能被 vendor 干扰;建议先删掉 vendor/ 或加 -mod=mod 参数强制走 module 模式。
• 模块路径写成本地路径(如 ./mylib),会导致 go build 失败 —— 必须是类似 github.com/user/repo 的远程导入路径格式。
引入依赖:用 go get 而不是手动编辑 go.mod
go get 不仅下载代码,还会自动更新 go.mod 和 go.sum,是唯一安全的引入方式。
立即学习“go语言免费学习笔记(深入)”;
- 引入最新版:
go get github.com/sirupsen/logrus
- 指定版本(推荐):
go get github.com/sirupsen/logrus@v1.9.3
- 升级到最新兼容小版本(如从 v1.8.x → v1.9.3):
go get -u github.com/sirupsen/logrus
- 只更新
go.mod中声明的版本,不拉取新代码:go get -d github.com/sirupsen/logrus
注意:go get 默认行为会“升级”间接依赖(transitive deps),可能意外改变其他库的行为。若只想引入某个库而不影响现有依赖树,加 -mod=readonly 参数校验后再操作。
处理私有仓库或国内拉取慢的问题
Go 默认从 proxy.golang.org 拉包,国内访问常超时或失败。可通过环境变量切换代理:
- 临时生效:
export GOPROXY=https://goproxy.cn,direct
- 永久生效(写入 shell 配置):
echo "export GOPROXY=https://goproxy.cn,direct" >> ~/.zshrc
私有 Git 仓库(如公司内网 GitLab)需配置 GOPRIVATE:
export GOPRIVATE=git.mycompany.com/*否则 Go 会尝试走公共 proxy,导致 403 或解析失败。
另外,go mod download 可预拉取所有依赖到本地缓存($GOPATH/pkg/mod),适合 CI 环境提前准备,避免构建时网络抖动。
为什么不能删 go.sum 或跳过校验?
go.sum 记录每个依赖模块的 checksum,用于防止依赖被篡改或替换。每次 go build 或 go get 都会校验。删掉它会导致下次构建失败(报 missing go.sum entry);强行跳过(-mod=mod + -mod=readonly 冲突)会让项目失去完整性保障。
真正容易被忽略的是:当团队共用一个 go.mod 时,有人本地用了 replace 或 exclude 却没提交,其他人 go build 就可能因 checksum 不匹配而中断 —— 所有修改都应显式提交 go.mod 和 go.sum。










