首页 / Go 语言入门教程 / 依赖管理

Go 语言入门教程

依赖管理

本教程共 80 篇 · 第 68 篇 · 更新于 2026-07-27 · 约 8 分钟阅读

GoGo 入门教程go getgo mod tidygo.sumMVS依赖管理

68. 依赖管理

本节目标:学会用 go get 添加依赖、go mod tidy 整理依赖,看懂 go.sum 校验文件,理解 MVS 版本选择机制。

添加依赖

直接在代码里 import 一个新包,然后跑 go mod tidy,Go 会自动帮你下载并写入 go.mod:

import "github.com/google/uuid"
go mod tidy

也可以用 go get 显式指定:

go get github.com/google/uuid           # 最新版本
go get github.com/google/uuid@v1.6.0    # 指定版本
go get github.com/google/uuid@latest    # 最新
go get github.com/google/uuid@main      # 某个分支

go get vs go mod tidy

两者有分工:

  • go get:主动添加或升级某个依赖,会修改 go.mod
  • go mod tidy:根据代码实际 import 情况,补全缺失依赖、删除没用的

日常流程:

  1. 写代码,import 新包
  2. go mod tidy,依赖自动加进来
  3. 想升级某个依赖,用 go get pkg@latest

go get 只管依赖

Warning

Go 1.18 起,go get 不再负责安装可执行程序,只管理 go.mod 里的依赖。装工具用 go install,下一节细讲。老教程里 go get -u 装二进制的方式已经过时。

升级和降级

# 升级到最新
go get github.com/google/uuid@latest

# 升级所有依赖到最新的次版本
go get -u ./...

# 降级到旧版本
go get github.com/google/uuid@v1.5.0

# 升级到某个大版本(不兼容升级)
go get github.com/some/lib/v2@latest
Note

大版本升级(v1 到 v2)import 路径会变。v2 及以上要在路径加版本号:github.com/some/lib/v2

go.sum 校验文件

go.sum 记录每个依赖的哈希值,用来校验下载的代码没被篡改:

github.com/google/uuid v1.6.0 h1:NI...
github.com/google/uuid v1.6.0/go.mod h1:OE...

每次 go mod tidygo get 都会更新 go.sum。提交代码时 go.mod 和 go.sum 要一起提交。

Tip

如果同事拉代码后报哈希校验失败,多半是依赖被改过或缓存坏了。跑 go clean -modcache 清掉缓存重新下载。

MVS 版本选择

Go 用 MVS(Minimal Version Selection,最小版本选择)算法决定用哪个版本的依赖。规则很简单:用所有依赖声明的最低版本中的最高那个。

假设你的项目依赖 A 和 B:

  • A 依赖 C v1.2
  • B 依赖 C v1.3

那最终用 C v1.3,因为它是「被要求的最高版本」。

MVS 的特点:

  • 不像 npm/pip 那样自动跳到最新,用声明版本里最高的
  • 结果可复现,go.mod 里写什么就是什么
  • 不会出现「不同机器装出不同版本」

indirect 间接依赖

你的代码直接 import 的叫直接依赖。你依赖的库自己 import 的,对你来说是间接依赖:

require (
	github.com/google/uuid v1.6.0          // 直接
	github.com/stretchr/testify v1.9.0      // 直接
	golang.org/x/sys v0.20.0 // indirect    // 间接,被上面两个用了
)

go mod tidy 会自动标注 // indirect。你一般不用手动管。

replace 本地替换

开发时常用 replace 把依赖指向本地路径,方便联调:

replace example.com/mylib => ../mylib

这样 import example.com/mylib 会用本地 ../mylib 的代码,不用先发布。

调试完记得删掉 replace,或者用 go work(下一节讲)替代。

查看依赖

go list -m all          # 列出所有依赖
go list -m -versions github.com/google/uuid  # 查看所有可用版本
go mod why github.com/google/uuid           # 为什么需要它
go mod graph             # 依赖关系图

go mod why 很实用,能帮你搞清楚某个间接依赖是怎么被引入的。

清理依赖

删掉代码里不再 import 的包后,跑 go mod tidy 会自动从 go.mod 移除对应依赖。不需要手动删 require 行。

小结

  • import + go mod tidy 是添加依赖的标准流程
  • go get pkg@version 指定或升级版本
  • go get 只管依赖,不装二进制(那是 go install 的事)
  • go.sum 记录哈希,保证依赖没被篡改
  • MVS 用声明版本中最高的,结果可复现
  • replace 指向本地路径方便联调
  • go mod tidy 自动补全、删除、标注 indirect

下一节讲 go install 安装命令行工具。