我正在尝试编写一个小程序,其中我有一些包,每个包都有一个实现接口的结构。我的想法是,基于用户输入,我可以选择用于构建特定结构的包,然后在其上调用一个他们应该拥有的函数。由于我事先并不知道类型,因此我觉得我可以使用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)
(如果有的话)的任何澄清都会非常有帮助!
答案 0 :(得分:2)
变量something
被声明为空接口。空接口上没有方法。要调用Dong
方法,请将something
声明为foo.Foo
。
更改
var something interface{}
到
var something foo.Foo
这假设bar
与foo
类似,表示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)来验证方法是否已实现。