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

时间:2016-10-21 04:02:21

标签: go go-interface

我正在尝试编写一个小程序,其中我有一些包,每个包都有一个实现接口的结构。我的想法是,基于用户输入,我可以选择用于构建特定结构的包,然后在其上调用一个他们应该拥有的函数。由于我事先并不知道类型,因此我觉得我可以使用if (playbackTimer) { [playbackTimer removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; playbackTimer = nil; } 并将其用作前向声明(请参阅最后一个代码段)。我有一些看起来像这样的东西:

interface{}

在另一个包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
}

运行/构建/ etc时,我收到以下错误:

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) (如果有的话)的任何澄清都会非常有帮助!

2 个答案:

答案 0 :(得分:2)

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

更改

var something interface{}

var something foo.Foo 

这假设barfoo类似,表示bar满足foo.Foo界面。

答案 1 :(得分:1)

如果看起来,你有点困惑。请选择 - 两种可能性之一。如果所有类型,你想要放入变量“某事”有方法丁,和东 - 比定义它的接口。 Foo不是最好的名字,更好的是DingDonger(https://golang.org/doc/effective_go.html#interface-names)。

后:

var something DingDonger

将检查每个分配给某个东西,类型是否真的有必需的方法,因此something.Ding()不会导致错误。

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