不会。go get -u 默认只更新直接依赖,不递归升级间接依赖,且不跨主版本;真正全量更新需用 go get -u=patch ./... 或 go get -u=minor ./...,并配合 go mod tidy 同步依赖状态。

go get -u 会更新所有依赖吗?
不会。go get -u 默认只更新当前目录下 import 的直接依赖,且不递归更新间接依赖(即 vendor 或 go.mod 中的 transitive deps)。它还会尝试升级到最新主版本(比如 v2 → v3),可能引发兼容性问题。
-
go get -u不读取go.mod的约束,容易绕过版本锁定 - 它修改
go.sum但不一定同步更新go.mod中的require行 - Go 1.16+ 默认启用 module mode,
go get -u在非 module 目录下可能静默失败
真正“一行命令更新全部依赖”的正确写法
用 go get -u=patch 或 go get -u=minor 配合 ./...,才能安全、完整地更新整个模块树:
-
go get -u=patch ./...:只升 patch 版本(如 v1.2.3 → v1.2.4),最保守,推荐日常使用 -
go get -u=minor ./...:升 minor 和 patch(如 v1.2.3 → v1.3.0),需人工验证 API 兼容性 -
go get -u ./...(无等号):行为等价于-u=minor,但易误解,不建议省略等号
执行后会:
- 递归扫描所有子包(
./...匹配当前模块内全部 package) - 尊重
go.mod中的replace和exclude规则 - 自动运行
go mod tidy(Go 1.16+),清理未引用项并补全缺失项
为什么不用 go mod tidy 单独更新?
go mod tidy 本身不升级版本,只做“最小化同步”:
- 添加缺失的依赖
- 删除未 import 的依赖
- 但不会把
v1.2.0主动升级到v1.2.5,除非你先手动改go.mod或用go get触发
常见误操作:
- 只跑
go mod tidy后发现版本没变,其实是预期行为 - 在 CI 中漏掉
go get -u=patch ./...,导致本地开发用新 patch,CI 构建仍用旧版 - 混淆
go list -m -u all(只检查可更新项,不执行更新)和实际升级命令
更新后必须检查的三件事
- 看
go.mod 是否有新增/变更的 require 行,尤其注意主版本跳变(如 github.com/some/lib v2.0.0+incompatible)
- 运行
go test ./...,某些 patch 版本会悄悄改变 behavior(比如 net/http 的 timeout 默认值)
- 检查
go.sum 文件大小是否异常膨胀——可能是某个依赖引入了大量新 indirect 模块,需用 go list -m all | grep xxx 定位源头
go.mod 是否有新增/变更的 require 行,尤其注意主版本跳变(如 github.com/some/lib v2.0.0+incompatible) go test ./...,某些 patch 版本会悄悄改变 behavior(比如 net/http 的 timeout 默认值) go.sum 文件大小是否异常膨胀——可能是某个依赖引入了大量新 indirect 模块,需用 go list -m all | grep xxx 定位源头 依赖更新不是“执行完就完事”,关键是让 go.mod 和实际运行时版本严格一致。每次 go get -u=patch ./... 后,go.mod 和 go.sum 都应提交进 Git。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











