HelloWorld

安装wire

  1. go get -u github.com/google/wire/cmd/wire
  1. package main
  2. import "fmt"
  3. type Monster struct {
  4. Name string
  5. }
  6. func NewMonster(name string) Monster {
  7. return Monster{Name: name}
  8. }
  9. type Fighter struct {
  10. Name string
  11. }
  12. func NewFighter(name string) Fighter {
  13. return Fighter{Name: name}
  14. }
  15. type Mission struct {
  16. Fighter Fighter
  17. Monster Monster
  18. }
  19. func NewMission(p Fighter, m Monster) Mission {
  20. return Mission{
  21. Fighter: p,
  22. Monster: m,
  23. }
  24. }
  25. func (m Mission) start() {
  26. fmt.Printf("%s defeates %s, world peace \n", m.Fighter.Name, m.Monster.Name)
  27. }
  28. func main() {
  29. monster := NewMonster("kitty")
  30. fighter := NewFighter("Ultraman")
  31. mission := NewMission(fighter, monster)
  32. mission.start()
  33. }

概念

wire有两个基础概念,Provider(构造器)和Injector(注入器)。

Provider

Provider实际上就是创建函数

Injector

我们上面InitMission就是Injector。每个注入器实际上就是一个对象的创建和初始化函数。在这个函数中,我们只需要告诉wire要创建什么类型的对象,这个类型的依赖,wire工具会为我们生成一个函数完成对象的创建和初始化工作。

  1. package main
  2. import "fmt"
  3. type FightParam string
  4. type MonsterParam string
  5. type Monster struct {
  6. Name string
  7. }
  8. func NewMonster(name MonsterParam) Monster {
  9. return Monster{Name: string(name)}
  10. }
  11. type Fighter struct {
  12. Name string
  13. }
  14. func NewFighter(name FightParam) Fighter {
  15. return Fighter{Name: string(name)}
  16. }
  17. type Mission struct {
  18. Fighter Fighter
  19. Monster Monster
  20. }
  21. func NewMission(f Fighter, m Monster) Mission {
  22. return Mission{
  23. Fighter: f,
  24. Monster: m,
  25. }
  26. }
  27. func (m Mission) start() {
  28. fmt.Printf("%s defeates %s, world peace \n", m.Fighter.Name, m.Monster.Name)
  29. }
  30. func main() {
  31. mission := InitMission(FightParam("kitty"),MonsterParam("Ultraman"))
  32. mission.start()
  33. }

创建wire,申明依赖关系

  1. //+build wireinject
  2. package main
  3. import "github.com/google/wire"
  4. func InitMission(f FightParam,m MonsterParam)Mission{
  5. wire.Build(NewFighter,NewMonster,NewMission)
  6. return Mission{}
  7. }

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 wireinjectpackage main这两行之间是否有空行,这个空行必须要有

执行wire命令,会生成wire_gen.go 文件

  1. // Code generated by Wire. DO NOT EDIT.
  2. //go:generate wire
  3. //+build !wireinject
  4. package main
  5. // Injectors from wire.go:
  6. func InitMission(f FightParam, m MonsterParam) Mission {
  7. fighter := NewFighter(f)
  8. monster := NewMonster(m)
  9. mission := NewMission(fighter, monster)
  10. return mission
  11. }