安装
go get github.com/google/wire/cmd/wire@latest
一.假设需要定义多个有依赖的启动项,新建main.go
package main
import ("fmt")
type Message string
func NewMessage() Message {
return Message("Hi there!")
}
type Event struct {
Greeter Greeter
}
func NewEvent(g Greeter) Event {
return Event{Greeter: g}
}
func (e Event) Start() {
msg := e.Greeter.Greet()
fmt.Println(msg)
}
func NewGreeter(m Message) Greeter {
return Greeter{Message: m}
}
type Greeter struct {
Message Message
}
func (g Greeter) Greet() Message {
return g.Message
}
func main() {
// message := NewMessage()
// greeter := NewGreeter(message)
// event := NewEvent(greeter)
// event.Start()
//如果没依赖注入,就需要写上面这些代码,现在用一个 InitializeEvent 方法包含这些,而这个方法让他自动生成
e := InitializeEvent()
e.Start()
}
二。新建一个 wire.go 文件,名称不一定用这个,但是为了规范和约束,一般都用这个。内容如下。 +build wireinject是简写,不能少
//go:build wireinject
// +build wireinject
package main
import "github.com/google/wire"
func InitializeEvent() Event {
wire.Build(NewEvent, NewGreeter, NewMessage)
return Event{}
}
//这个是简写,直接用 panic 包裹起来即可,因为不需要检查,所以不需要反馈
// func InitializeEvent() Event {
// panic(wire.Build(NewEvent, NewMessage, NewGreeter))
// }
三。执行 wire 命令,wire gen wire.go,自动生成 wire_gen.go 文件,内容如下:
// Code generated by Wire. DO NOT EDIT.
//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
// Injectors from wire.go:
func InitializeEvent() Event {
message := NewMessage()
greeter := NewGreeter(message)
event := NewEvent(greeter)
return event
}