我正在尝试编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。这个想法是,基于用户输入,我可以选择使用哪个包来构建特定结构,然后在其上调用他们都应该拥有的函数。由于我事先不知道类型,我的印象是我可以使用 ainterface{}
并将其用作前向声明(参见最后一个代码片段)。我有一些看起来像这样的东西:
package foo
type FooInput struct {
Bar string
Baz int
}
type Foo interface {
Ding()
Dong()
}
在另一个包中bob
,我有类似的东西:
type Bob struct {
foo.FooInput
}
func (mybob *Bob) Ding() {}
func (mybob *Bob) Dong() {}
func MakeBob(foo_input foo.FooInput) (*Bob, error) {
my_bob := Bob{foo_input}
return &my_bob, nil
}
在我的主包中,我有一些看起来像这样的东西:
data = foo.FooInput("awyiss", 1}
var something interface{}
var err error
switch some_string {
case "foo":
something, err = bob.MakeBob(foo_input)
case "bar":
// imagine bar is like foo
something, err = bar.MakeBar(foo_input)
// imagine other cases
}
something.Dong()
运行/构建/等时,我收到以下错误:
something.Dong undefined (type interface {} is interface with no methods)
我对自己做错了什么感到有些困惑......关于我应该如何使用interface{}
(如果有的话)的任何澄清都会非常有帮助!