HelloWorld
安装wire
go get -u github.com/google/wire/cmd/wire
package mainimport "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 FighterMonster 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 mainimport "fmt"type FightParam stringtype MonsterParam stringtype 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 FighterMonster 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 wireinjectpackage mainimport "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 !wireinjectpackage main// Injectors from wire.go:func InitMission(f FightParam, m MonsterParam) Mission {fighter := NewFighter(f)monster := NewMonster(m)mission := NewMission(fighter, monster)return mission}
