HelloWorld
安装wire
go get -u github.com/google/wire/cmd/wire
package main
import "fmt"
type Monster struct {
Name string
}
func NewMonster(name string) Monster {
return Monster{Name: name}
}
type Fighter struct {
Name string
}
func NewFighter(name string) Fighter {
return Fighter{Name: name}
}
type Mission struct {
Fighter Fighter
Monster Monster
}
func NewMission(p Fighter, m Monster) Mission {
return Mission{
Fighter: p,
Monster: m,
}
}
func (m Mission) start() {
fmt.Printf("%s defeates %s, world peace \n", m.Fighter.Name, m.Monster.Name)
}
func main() {
monster := NewMonster("kitty")
fighter := NewFighter("Ultraman")
mission := NewMission(fighter, monster)
mission.start()
}
概念
wire有两个基础概念,Provider(构造器)和Injector(注入器)。
Provider
Injector
我们上面InitMission就是Injector。每个注入器实际上就是一个对象的创建和初始化函数。在这个函数中,我们只需要告诉wire要创建什么类型的对象,这个类型的依赖,wire工具会为我们生成一个函数完成对象的创建和初始化工作。
package main
import "fmt"
type FightParam string
type MonsterParam string
type Monster struct {
Name string
}
func NewMonster(name MonsterParam) Monster {
return Monster{Name: string(name)}
}
type Fighter struct {
Name string
}
func NewFighter(name FightParam) Fighter {
return Fighter{Name: string(name)}
}
type Mission struct {
Fighter Fighter
Monster Monster
}
func NewMission(f Fighter, m Monster) Mission {
return Mission{
Fighter: f,
Monster: m,
}
}
func (m Mission) start() {
fmt.Printf("%s defeates %s, world peace \n", m.Fighter.Name, m.Monster.Name)
}
func main() {
mission := InitMission(FightParam("kitty"),MonsterParam("Ultraman"))
mission.start()
}
创建wire,申明依赖关系
//+build wireinject
package main
import "github.com/google/wire"
func InitMission(f FightParam,m MonsterParam)Mission{
wire.Build(NewFighter,NewMonster,NewMission)
return Mission{}
}
wireinject
wire.go和wire_gen.go文件头部位置都有一个+build,不过一个后面是wireinject,另一个是!wireinject。+build
其实是 Go 语言的一个特性。类似 C/C++ 的条件编译,在执行go build时可传入一些选项,根据这个选项决定某些文件是否编译。wire工具只会处理有wireinject的文件,所以我们的wire.go文件要加上这个。生成的wire_gen.go是给我们来使用的,wire不需要处理,故有!wireinject。
由于现在是两个文件,我们不能用go run main.go
运行程序,可以用go run .
运行。注意,如果你运行时,出现了InitMission
重定义,那么检查一下你的//+build wireinject
与package main
这两行之间是否有空行,这个空行必须要有
执行wire命令,会生成wire_gen.go 文件
// Code generated by Wire. DO NOT EDIT.
//go:generate wire
//+build !wireinject
package main
// Injectors from wire.go:
func InitMission(f FightParam, m MonsterParam) Mission {
fighter := NewFighter(f)
monster := NewMonster(m)
mission := NewMission(fighter, monster)
return mission
}