Google Wire注入:如何处理提供者函数多返回值仅注入其一
Google Wire 处理多返回值仅注入单个值的方案
针对你提出的两种多返回值场景,分别给出具体实现方案:
场景1:构造函数返回(目标类型,error)
比如NewMessage() (Message, error)这种带错误返回的情况,Wire原生支持错误传递,只需要调整初始化函数的返回类型,让错误能向上透传即可:
修改后的初始化代码:
func main() { e, err := InitializeEvent() if err != nil { log.Fatalf("初始化失败: %v", err) } e.Start() } func InitializeEvent() (Event, error) { wire.Build(NewEvent, NewMessage) return Event{}, nil }
Wire会自动识别构造函数的错误返回值,将NewMessage产生的错误传递给InitializeEvent的调用者,你只需要在主函数里正常处理错误就行。
场景2:构造函数返回两个不同类型的值(仅需其中一个)
比如NewMessage() (Message, Greeter)这种情况,我们可以写一个适配器函数,接收所有返回值并只返回需要的那个类型,然后把这个适配器加入Wire的依赖链:
首先定义适配器函数:
// 只提取Message,忽略Greeter func GetMessageOnly(msg Message, _ Greeter) Message { return msg }
然后修改初始化函数:
func InitializeEvent() Event { wire.Build(NewEvent, GetMessageOnly, NewMessage) return Event{} }
Wire会先调用NewMessage得到Message和Greeter,再把这两个值传给GetMessageOnly,提取出我们需要的Message,最后注入给NewEvent完成初始化。
另外还有一种更简洁的方式,直接在Wire的构建声明里用匿名函数(可读性稍差):
func InitializeEvent() Event { wire.Build( NewEvent, func(msg Message, _ Greeter) Message { return msg }, NewMessage, ) return Event{} }
内容的提问来源于stack exchange,提问作者vuhoanghiep1993
相关产品推荐
相关产品推荐

