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

使用可变参数实现接口方法

使用可变参数实现接口方法

Go
白猪掌柜的 2021-11-15 16:09:50
我从简单的界面开始:type Module interface {    Init(deps ...interface{}) error}我想,实现会非常简单,因为这个方法应该匹配任意数量的提供参数。这就是我最终用这段代码思考的内容,TestModule实现了Module接口。type TestModule struct {}func (m *TestModule) Init(str string) error {    return nil}但是当我想将 TestModule 传递给任何需要 Module 的函数时,我收到此错误:不能在 testFunc 的参数中使用 module(type *TestModule) 作为类型 Module:func testFunc(module Module) {}编辑:是否有任何最佳实践来实现这种行为?
查看完整描述

1 回答

?
慕的地6264312

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

这没有实现接口;


func (m *TestModule) Init(str string) error {

    return nil

}

出现混淆的地方在于“因为此方法应该匹配任意数量的提供参数”,这是一种语言功能,它允许调用者使用可变数量的参数调用该方法(请参阅此处“...”在旁边是什么意思go 函数声明中的参数?)。要实现它,您需要实现相同的签名含义... interface{}。


所以要明确的是,“提供的任意数量的参数”仅用于调用方法,这并不意味着您可以使用任何类型的任何参数集来实现该方法,并且它将具有相同的定义。定义指出interface{}调用者传入的实现项的数量是可变的。


“是否有任何最佳实践来实施这种行为?”


从来没听说过。我认为通常的做法是放宽传递给interface{}or 的类型... interface{},然后检查方法内的集合。例如,如果Module接口有它的定义,Init(deps interface{}) error那么你可以像这样在测试模块中实现它;


func (m *TestModule) Init(deps interface{}) error {

      str := deps.(string)

      return nil

}

如果您想要可变长度的 args,您只需要for range在方法中添加一个构造来取消装箱值或进行一些边界检查。我无法确定这在您的应用程序中是否是一个好的做法,因为我认为这取决于您从单个方法 sig 中获得的价值。它添加了额外的样板代码并有一些轻微的性能损失。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

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