为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在 golang 中进行简单的依赖注入

是否可以在 golang 中进行简单的依赖注入

Go
一只名叫tom的猫 2023-02-06 19:31:02
我来自 node.js 和 nest.js 世界,DI 很简单,由框架提供。在构建服务时,我可以或应该考虑使用依赖注入吗?
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

是的,在 Go 中是可能的。


一个简单的 Go 的三步 DI 系统:


假设您有一个包 A,它不应该导入包 B,而是调用该包中的一些函数;例如,函数 Load() 和 Save()。


在包 A 中,使用这些函数定义一个接口类型。

type Storage interface {

    Load(string) []byte

    Save(string, []byte)

}

然后,包 A 中的类型可以引用该接口并调用 Load() 和 Save(),而无需知道这些调用的实际接收者。


type StructA struct {

    content []byte

    storage Storage

}


func NewStructA(s Storage) *StructA {

    return &StructA{

        content: ...,

        storage: s,

    }

}


func (a *StructA) Save(name string) {

    a.storage.Save(name, a.content)

}


func (a *StructA) Load(name string) {

    a.content = a.storage.Load(name)

}

在包 B 中,实现 Load() 和 Save()。

type StoreB struct {

    poem []byte

}


func (b *StoreB) Save(name string, contents []byte) {

    // let's say StoreB contains a map called data

    b.data[name] = contents

}


func (b *StoreB) Load(name string) []byte {

    return b.data[name]

}

在包装main中,连接电线。

storage := B.StructB

a := A.NewStructA(storage)

a.Save()

现在您可以添加其他存储提供(包 C、D、...)并将它们连接到main.


storage2 := C.StructC

a2 := A.NewStructA(storage2)

a2.Save()

此处有更详细的讨论:https ://appliedgo.net/di/


查看完整回答
反对 回复 2023-02-06
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

一个基于依赖注入的 Go 应用程序框架。 https://github.com/uber-go/fx

Go 的基于反射的依赖注入工具包。https://github.com/uber-go/dig


查看完整回答
反对 回复 2023-02-06
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

是的,你应该在 go 中考虑 DI,DI 在 go 中具有与任何其他语言相同的优势。在go中使用接口可以轻松实现。



查看完整回答
反对 回复 2023-02-06
  • 3 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信