猿问

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

我从简单的界面开始:


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) {


}

编辑:是否有任何最佳实践来实现这种行为?


白猪掌柜的
浏览 249回答 1
1回答

慕的地6264312

这没有实现接口;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 中获得的价值。它添加了额外的样板代码并有一些轻微的性能损失。
随时随地看视频慕课网APP

相关分类

Go
我要回答