Go 创建结构时正确使用接口

Go 创建结构时正确使用接口,go,go-interface,Go,Go Interface,我正试图编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。其思想是,基于用户输入,我可以选择使用哪个包来构建特定的结构,然后在其上调用它们都应该具有的函数。因为我事先不知道类型,所以我的印象是我可以使用接口{},并将其用作转发声明(参见最后的代码片段)。我有一些东西看起来像这样: package foo type FooInput struct { Bar string Baz int } type Foo interface { Ding()

我正试图编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。其思想是,基于用户输入,我可以选择使用哪个包来构建特定的结构,然后在其上调用它们都应该具有的函数。因为我事先不知道类型,所以我的印象是我可以使用接口{},并将其用作转发声明(参见最后的代码片段)。我有一些东西看起来像这样:

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()
运行/building/etc时,出现以下错误:

something.Dong undefined (type interface {} is interface with no methods)
我有点困惑我做错了什么。。。任何关于我应该如何使用接口{}的澄清都非常有用

变量something被声明为空接口。空接口上没有方法。要调用Dong方法,请将某个对象声明为foo.foo

改变

var something interface{}


这假设bar与foo相似,意味着bar满足foo.foo接口。

如果看起来像,您会有点困惑。请从两种可能性中选择一种。如果要放入变量某物的所有类型都有方法Ding和Dong-than,则为其定义接口。 福不是最好的名字,丁东儿更好

之后:

var something DingDonger
每一个赋值都会被检查,类型是否真的有所需的方法,因此。叮当不会导致错误


如果任何变量是类型接口{},没有人知道它是否有这样的方法,您必须使用类型断言来验证是否实现了该方法。

我试图更好地演示这个问题,请参阅我上次的编辑
var something DingDonger