关于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 @   酒沉吟  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2018-06-13 WebService安全之SoapHeader验证
2018-06-13 WebService上传图片及调用
2012-06-13 关于PageBase页面继承类的写法
点击右上角即可分享
微信分享提示