关于Golang中的依赖注入实现

先定义一个内部调用接口 用于后面的注入

// 被 注入的接口
type UserFace interface {
    Get() string
    Set() string
}

然后定义一个 Struct ,开启构造函数,并实现 上面的 接口 

type SysUser struct {
    Name string
}

// User的构造函数
func NewSysUser(Name string) *SysUser {
    return &SysUser{Name: Name}
}

// 实现接口 UserFace
func (u *SysUser) Get() string {
    return "SysUser.Get"
}

// 实现接口 UserFace
func (u *SysUser) Set() string {
    return "SysUser.Set"
}

定义一个对 外部 (main 或者是 gin可以直接 调用的)调用接口

type MyFace interface {
    Sum(a int, b int) int
}

然后 定义外部Struct  用于实现上面的  外部 调用接口,并且 注入内部调用接口UserFace 

 

// 定义结构体  并注入 UserFace
type MyStruct struct {
    UserFace UserFace // 注入 UserFace
}

// MyStruct构造函数
func NewMyStruct(face UserFace) *MyStruct {
    return &MyStruct{
        UserFace: face, // 注入 SysUser 系统用户
    }
}

// 实现接口 MyFace
func (ms *MyStruct) Sum(a int, b int) int {
    getval := ms.UserFace.Get() // 调用 注入的 UserFace 的Get方法
    setVal := ms.UserFace.Set() // 调用 注入的 UserFace 的Set方法
    fmt.Println("MyStuct调用了UserFace Get: ", getval)
    fmt.Println("MyStuct调用了UserFace Set: ", setVal)
    return a + b
}

 

 

 

Main 使用  (注意:不能face.UserFace.Get() 这么调,因为UserFace是接口类型,只能在实现 MyFace 接口并注入 UserFace的 MyStruct 里调用 )

func main() {
    sysUser := NewSysUser("张三")            // 定义注入实体
    var face MyFace = NewMyStruct(sysUser) // 定义 外部 接口类型 并将实体注入
    result := MyFace.Sum(face, 1, 2)       // 调用外部接口方法
    fmt.Println(result)
    //face.UserFace.Get()   // 注意 不能这么调,因为UserFace是接口类型
}

 

posted @ 2024-06-13 23:37  酒沉吟  阅读(3)  评论(0编辑  收藏  举报