-1

我正在尝试编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。这个想法是,基于用户输入,我可以选择使用哪个包来构建特定结构,然后在其上调用他们都应该拥有的函数。由于我事先不知道类型,我的印象是我可以使用 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{}(如果有的话)的任何澄清都会非常有帮助!

4

2 回答 2

2

该变量something被声明为空接口。空接口上没有方法。要调用该Dong方法,请声明somethingfoo.Foo.

改变

var something interface{}

var something foo.Foo 

这假设barfoo意味着bar满足foo.Foo接口。

于 2016-10-21T04:07:49.033 回答
1

如果看起来,那你有点糊涂了。请选择 - 两种可能性之一。如果要放入变量“某物”的所有类型都有方法 Ding 和 Dong - 比为它定义接口。Foo 不是最好的名字,更好的是 DingDoner ( https://golang.org/doc/effective_go.html#interface-names )。

后:

var something DingDonger

每次分配给某物都会被检查,类型是否真的有需要的方法,因此某物.Ding() 不会导致错误。

如果任何变量是 interface{} 类型,没人知道,它是否有这样的方法,你必须使用类型断言(https://golang.org/doc/effective_go.html#interface_conversions)来验证方法是否被实现。

于 2016-10-21T08:00:45.480 回答