【go】wire的具体各类用法
生活随笔
收集整理的這篇文章主要介紹了
【go】wire的具体各类用法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文僅記錄wire的具體使用方法, 而wire這個工具的作用, 功能和優(yōu)缺點不再贅述
wire的github地址: https://github.com/google/wire
demo中struct依賴關系
場景一 成員變量是結構體類型
用法一: 直接通過各struct的new函數(shù)拼裝
自定義了所有struct的new函數(shù), 通過wire.Build()組裝
func InitService1() *Service {
wire.Build(NewService1, NewRemoteCallA, NewRemoteCallB)
return &Service{}
}
用法二: 使用ProviderSet(可包含大于等于1個new函數(shù))
將New函數(shù)放到ProviderSet里, 再傳到wire.Build函數(shù)內
var RemoteCallSet = wire.NewSet(NewRemoteCallA, NewRemoteCallB)
func InitService2() *Service {
wire.Build(NewService1, RemoteCallSet)
return &Service{}
}
ProviderSet里可以是其他ProviderSet 千層餅一樣嵌套下去
用法三: 最上層struct不需要提供new函數(shù), 以wire.Struct代替
使用wire.Struct() 代替最終要生產的struct的New函數(shù)
第二個參數(shù) "*" 表示所有字段都進行初始化
wire.Value() 作用是將值轉化為一個ProviderSet, 以滿足wire.Build()入?yún)㈩愋?/p>
func InitService3() *Service {
wire.Build(wire.Struct(new(Service), "*"), NewRemoteCallA, NewRemoteCallB, wire.Value("a"))
return &Service{}
}
用法四: wire.Struct 指定具體字段
wire.Struct() 不使用 "*" 而是指定具體字段名
func InitService4() *Service {
wire.Build(wire.Struct(new(Service), "remoteCallA"), NewRemoteCallA)
return &Service{}
}
func InitService5(rb *RemoteCallB, c string) *Service { wire.Build(wire.Struct(new(Service), "*"), NewRemoteCallA) return &Service{} }
需要注意的是結構體里不能有相同類型的兩個及以上的字段, 如:
type Service struct {
a string
b string
// ... 其他字段
}
是不允許的, 解決方法就是使用類型別名解決沖突, 會報錯
provider struct has multiple fields of type string
場景二: 成員變量為interface類型
用法一: 使用返回interface的new函數(shù)
func InitService7() *Service2 {
wire.Build(wire.Struct(new(Service2), "*"), NewRemoteCallInterface, wire.Value("a"))
return &Service2{}
}
用法二: 使用ProviderSet, 將具體struct的New函數(shù)綁定到interface上
var RemoteCallASet = wire.NewSet(NewRemoteCallA, wire.Bind(new(RemoteCall), new(*RemoteCallA)))
func InitService8() *Service2 {
wire.Build(wire.Struct(new(Service2), "*"), RemoteCallASet, wire.Value("a"))
return &Service2{}
}
```[]()
總結
以上是生活随笔為你收集整理的【go】wire的具体各类用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑与漂亮老婆
- 下一篇: linux下的精确wait