require 语句仅存在于 go.mod 文件中,用于声明直接依赖的模块路径和版本;应通过 go get 自动管理,手动修改需配合 go mod download 或再次 go get 才生效,且受 exclude 和 replace 优先级约束。

require 语句必须写在 go.mod 文件里
require 不是 Go 源码中的关键字,也不是 go build 的命令参数,它只存在于模块根目录下的 go.mod 文件中,用于声明项目直接依赖的模块路径和版本。手动编辑 go.mod 添加 require 行通常不推荐,容易出错;应优先让 Go 工具链自动生成。
用 go get 自动写入 require(推荐方式)
运行 go get 是触发 require 写入的标准做法。它会解析导入语句、下载模块、更新 go.mod,并自动添加或调整 require 行:
- 添加新依赖:
go get github.com/gin-gonic/gin@v1.9.1 - 升级已有依赖:
go get github.com/sirupsen/logrus@latest - 降级或指定 commit:
go get github.com/spf13/cobra@e7a0c6
执行后,go.mod 中会出现类似这样的行:
require github.com/gin-gonic/gin v1.9.1如果该模块已出现在
import 中,Go 会保留其版本;否则可能标记为 // indirect(间接依赖)。
require 后面的版本号不能随便改
手动修改 require 行的版本字符串,不代表依赖真的被切换——Go 不会自动下载或校验。必须配合 go mod download 或再次 go get 才生效。常见错误包括:
立即学习“go语言免费学习笔记(深入)”;
- 把
v1.2.3改成v1.2.4后没运行任何命令,代码仍用旧版 - 写错格式,比如漏掉
v前缀:github.com/xxx/yyy 1.2.3→ 应为github.com/xxx/yyy v1.2.3 - 使用本地路径(如
./mymodule)时未加replace,导致go build报no matching versions
require 和 replace / exclude 共存时的优先级
当 go.mod 中同时存在 require、replace 和 exclude,Go 的解析顺序是:先应用 exclude(彻底剔除某版本),再用 replace 覆盖 require 指定的模块路径或版本。例如:
require github.com/go-sql-driver/mysql v1.7.0
replace github.com/go-sql-driver/mysql => ./mysql-local
exclude github.com/go-sql-driver/mysql v1.6.0
此时实际编译使用的是本地 ./mysql-local,且 v1.6.0 版本被禁止参与版本选择。注意:replace 不影响 go list -m all 输出的“声明依赖”,只影响构建时的模块解析。
require 行本身不控制加载时机或条件编译,它只是模块图的起点;真正决定哪个版本被选中的是整个模块图的最小版本选择(MVS)算法——这点常被忽略,尤其在多层依赖冲突时,光看 require 行容易误判实际使用的版本。










