创建结构时正确使用接口
Using interfaces correctly when creating structs
我正在尝试编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。我的想法是,基于用户输入,我可以选择使用哪个包来构建特定结构,然后在其上调用它们都应该具有的函数。由于我不知道提前的类型,我的印象是我可以使用 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
}
在我的主包中,我有一些看起来像这样的东西:
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)
我对我做错了什么感到有点困惑...任何关于我应该如何使用 interface{}
(如果有的话)的澄清都将非常有帮助!
变量something
声明为空接口。空接口上没有方法。要调用 Dong
方法,请将 something
声明为 foo.Foo
.
改变
var something interface{}
至
var something foo.Foo
这假设 bar
像 foo
意味着 bar
满足 foo.Foo
接口。
如果看起来,那你有点糊涂了。请选择 - 两种可能性之一。如果要放入变量 "something" 的所有类型都具有方法 Ding 和 Dong - 而不是为其定义接口。
Foo 不是最好的名字,更好的是 DingDonger(https://golang.org/doc/effective_go.html#interface-names).
之后:
var something DingDonger
每次赋值都会被检查,类型是否真的有需要的方法,因此 something.Ding() 不会导致错误。
如果任何变量是类型接口{},没有人知道它是否有这样的方法,你必须使用类型断言(https://golang.org/doc/effective_go.html#interface_conversions)来验证方法是否被实现。
我正在尝试编写一个小程序,其中有几个包,每个包都有一个实现接口的结构。我的想法是,基于用户输入,我可以选择使用哪个包来构建特定结构,然后在其上调用它们都应该具有的函数。由于我不知道提前的类型,我的印象是我可以使用 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
}
在我的主包中,我有一些看起来像这样的东西:
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)
我对我做错了什么感到有点困惑...任何关于我应该如何使用 interface{}
(如果有的话)的澄清都将非常有帮助!
变量something
声明为空接口。空接口上没有方法。要调用 Dong
方法,请将 something
声明为 foo.Foo
.
改变
var something interface{}
至
var something foo.Foo
这假设 bar
像 foo
意味着 bar
满足 foo.Foo
接口。
如果看起来,那你有点糊涂了。请选择 - 两种可能性之一。如果要放入变量 "something" 的所有类型都具有方法 Ding 和 Dong - 而不是为其定义接口。 Foo 不是最好的名字,更好的是 DingDonger(https://golang.org/doc/effective_go.html#interface-names).
之后:
var something DingDonger
每次赋值都会被检查,类型是否真的有需要的方法,因此 something.Ding() 不会导致错误。
如果任何变量是类型接口{},没有人知道它是否有这样的方法,你必须使用类型断言(https://golang.org/doc/effective_go.html#interface_conversions)来验证方法是否被实现。