持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前言

Golang 没有类的概念,也不是面向对象的编程思想。不像 Java 语言中控制反转是面向对象编程的原则之一。使用依赖注入主要是为实现高内聚低耦合的设计思想。在 Golang 常用库中有一个 DI 的工具—wire。它能够根据你的代码生成相应的依赖注入 Go 代码。但在查阅资料的时候还发现了一个另外的库包—Call。基于注册表实现参数和函数的依赖注入库。

使用 Call

工具包 Call 是 Golang 的一个简单依赖注入第三方库。它将所有的方法和参数都保存在一个映射中,然后就可以随时调用和使用。

可以写些简单的 demo 实践一下,首先需要先安装

go get github.com/rytsh/call
复制代码

又一个函数有一些不同的和相同类型的参数

func GeneratorToken(ctx context.Context, id string)(string, error){
    if isFinished {
        return "", fmt.Errorf("task %s is canceled",id)
    }
    return “this is token ”, nil
}
复制代码

创建完函数后,就可以将该函数和它参数注册到 Call 中。

您可以按任何顺序添加函数和参数。 它只是添加一个内部映射的关系。

reg :=call.NewReg() // 获取新的注册表

reg.AddFunction("GeneratorToken", GeneratorToken,"context","id") // 向注册表中加入函数和参数
复制代码

现在使用 GeneratorToken 函数时:

// 注册表传入对应的参数然后调用
reg.AddArgument("context",context.Background())
   .AddArgument("id","738293232")
result, err := reg.Call("GeneratorToken")
复制代码

此函数返回称为returns 的 GeneratorToken 函数的所有返回,如果Call 函数不能调用 GeneratorToken 函数,则返回err。

返回变量类型是 []interface{},所以我们应该转换并得到我们想要的。 在我们的示例中,GeneratorToken 函数返回一种字符串类型。

以上的方式通过注册的方式添加方法和参数,然后在调用真正的函数时需要先传入具体的参数。当然,也支持直接调用的时候传入实参。主要使用 CallWithArgs 的方法:

result, err := reg.CallWithArgs("GeneratorToken",context.Background(),"id_237829372")
复制代码

如果函数的参数长度和类型不匹配,它将返回错误。

参考资料: