wire仅识别显式声明的provider函数,要求参数与返回类型严格匹配,接口需用wire.bind显式绑定,结构体字段须有对应provider或用wire.struct构造,且所有依赖必须列于wire.build中。

Wire 不支持“注入字段”或“自动绑定构造函数”,它只认显式声明的 provider 函数——也就是说,NewDB、NewCache 这类函数必须手动写出来,wire 才能识别并串联调用。所谓“构造函数绑定”,本质是把一个返回具体类型的函数注册为该类型的 provider。
provider 函数签名必须严格匹配依赖类型
Wire 完全不看函数名或注释,只靠参数类型和返回类型推导依赖关系。常见失败点:
-
*sql.DB和database/sql.*DB视为不同类型(即使底层相同),必须完全一致 - 返回
*redis.Client的函数不能和另一个也返回*redis.Client的函数共存,否则报multiple providers found for *redis.Client - 带
error的返回是合法的:func() (*sql.DB, error),但 injector 签名里没声明接收error,Wire 会静默跳过这个 provider - 未导出别名如
type DB *sql.DB无法被识别,必须用wire.Bind显式桥接接口
如何让结构体字段自动被 Wire 初始化
Wire 不会扫描结构体字段,也不会“自动注入”。要让某个字段被填上值,你得提供一个返回该字段类型的 provider,并确保它出现在 wire.Build() 列表中:
- 如果
type Service struct { db *sql.DB },你就得有func NewDB() *sql.DB或类似函数 - 如果
db字段类型是接口DBer,而实现是*sql.DB,必须加wire.Bind(new(DBer), new(*sql.DB)) - 不想写
NewDB?可用wire.Struct直接构造:wire.Struct(new(Service), "*"),但前提是所有字段类型都有对应 provider
wire.Build() 漏掉 provider 就编译失败,错误提示不直接
Wire 不扫描整个包,只处理 wire.Build() 显式列出的函数。漏掉中间环节,生成的 wire_gen.go 会缺失初始化逻辑,最终报错像这样:
./wire_gen.go:12:9: undefined: NewRepository
而不是 “你没把 NewRepository 加进 wire.Build()”。排查路径是:从 injector 入口开始,逐层检查每个依赖是否都有 provider 被传入 wire.Build()。
例如 InitializeApp() → NewService() → NewRepository() → NewDB(),这四个函数都得出现在 wire.Build(InitializeApp, NewService, NewRepository, NewDB) 里。
interface 绑定必须用 wire.Bind,不能靠类型推导
Wire 默认只匹配具体类型,接口需要显式声明绑定关系:
- 定义
type Logger interface { Log(string) }和type StdLogger struct{} - 提供
func NewStdLogger() *StdLogger - 在
wire.Build()中加入:wire.Bind(new(Logger), new(*StdLogger)) - 否则
func NewHandler(log Logger) *Handler会报no provider found for Logger
绑定必须成对出现:左边是接口类型字面量,右边是实现类型的字面量,顺序不能反。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











