1 回答
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 中获得的价值。它添加了额外的样板代码并有一些轻微的性能损失。
- 1 回答
- 0 关注
- 244 浏览
添加回答
举报