gpt4 book ai didi

go - 使用可变参数实现接口(interface)方法

转载 作者:IT王子 更新时间:2023-10-29 01:51:17 27 4
gpt4 key购买 nike

我从简单的界面开始:

type Module interface {
Init(deps ...interface{}) error
}

我想,实现会非常简单,因为这个方法应该匹配任意数量的提供参数。这就是我最终得到的这段代码,我想,TestModule 实现了 Module 接口(interface)。

type TestModule struct {
}

func (m *TestModule) Init(str string) error {
return nil
}

但是当我想将 TestModule 传递给任何需要 Module 的函数时,我得到这个错误:

cannot use module(type *TestModule) as type Module in argument to testFunc:

func testFunc(module Module) {

}

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

最佳答案

这没有实现接口(interface);

func (m *TestModule) Init(str string) error {
return nil
}

你的困惑出现在“因为这个方法应该匹配任意数量的提供的参数”这是一个语言特性,它允许调用者调用带有可变数量参数的方法(参见这里 What does "..." mean when next to a parameter in a go function declaration? ).要实现它,您需要实现相同的签名含义 ... interface{}

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

“有什么最佳实践可以实现这种行为吗?”

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

func (m *TestModule) Init(deps interface{}) error {
str := deps.(string)
return nil
}

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

关于go - 使用可变参数实现接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com