go list -m all 查当前项目实际使用的依赖版本;go list -m -versions 查某模块可用版本;go list -f '{{.ImportPath}} {{.Module.Path}} {{.Module.Version}}' 查导入路径对应的实际模块与版本。

直接看当前项目实际使用的依赖版本,用 go list -m all 就行;想查某个包有哪些可用版本(比如准备升级),得用 go list -m -versions 。
查当前项目所有依赖及其版本
这是最常用、也最贴近构建事实的命令。它读取 go.mod 并执行模块图求解,输出项目里“真正加载”的每个模块和对应版本(含伪版本)。
-
go list -m all列出全部依赖,包括间接依赖;如果只关心显式require的,加-f '{{if not .Indirect}}{{.Path}} {{.Version}}{{end}}'过滤 - 遇到
replace时,.Version显示(devel),不是语义化版本号,但路径和替换关系是真实的 - 标准库包(如
net/http)不会出现在结果里,因为它们不属于模块体系 - 输出不含校验和,要验证完整性得配合
go mod verify
查某个模块有哪些可选版本
这个命令不依赖当前项目,而是向 Go proxy(默认 proxy.golang.org)或本地缓存发起查询,返回该模块所有 tagged 版本 + pseudo-version。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
go list -m -versions github.com/gin-gonic/gin能看到从v1.0.0到v1.9.1再到v0.0.0-20240101000000-abc123的完整列表 - 若
GO_PROXY=off或网络不通,会报错no matching versions for query "latest",不是命令写错了 - 结果不表示当前项目用了这些版本,只说明“能拉到”,真正用哪个由
go.mod和最小版本选择(MVS)决定
查某段 import 实际解析到哪个模块和版本
当你在代码里写了 import "github.com/sirupsen/logrus",但不确定构建时到底加载的是不是你预期的版本,就该用这个命令。
go list -f '{{.ImportPath}} {{.Module.Path}} {{.Module.Version}}' github.com/sirupsen/logrus-
必须是合法导入路径,不能是模块名缩写(比如logrus不行,github.com/sirupsen/logrus才行) - 如果该路径被
exclude或replace影响,输出会如实体现,比go list -m all更贴近编译器视角 - 对标准库路径(如
net/http),.Module字段为空,.Version为"",此时版本即 Go 工具链版本
真正容易被忽略的是:Go 没有“已安装包”的全局概念,所谓“版本”永远绑定在模块作用域里——要么是当前 go.mod 解析出的,要么是 proxy 缓存里可获取的,要么是某次 import 时实际加载的。离了上下文谈“版本”,大概率查错地方。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










