由于Go非常重视接口,我想知道如何明确说明一个结构正在实现一个接口以便清除和错误检查,以防某些方法丢失?到目前为止,我已经看到了两种方法,我想知道哪种方法是正确的,并且符合Go规范。
方法1 - 匿名字段
type Foo interface{
Foo()
}
type Bar struct {
Foo
}
func (b *Bar)Foo() {
}
方法2 - 显式转换
type Foo interface{
Foo()
}
type Bar struct {
}
func (b *Bar)Foo() {
}
var _ Foo = (*Bar)(nil)
这些方法是否正确,还是有其他方法可以做这样的事情?
答案 0 :(得分:8)
方法2是正确的方法1,方法1只是嵌入一个类型并覆盖其功能。如果你忘了覆盖它,你最终会得到一个nil指针取消引用。
答案 1 :(得分:1)
你做不到。在Go中,所有接口实现都是隐式的。您可以检查类型是否实现和接口(它获得的最明确)。如果我在一个项目中正确地回忆起我在其中工作,只是在包的顶部对类型实现的接口做了一些类型的断言,尽可能接近显式。
答案 2 :(得分:1)
我很少需要声明这一点,因为我的包中几乎总有某个地方我使用struct作为接口。我倾向于遵循尽可能保持我的结构未暴露的模式,并且只通过“构造函数”函数提供它们。
type Foo interface{
Foo()
}
type bar struct {}
func (b *bar)Foo() {}
func NewBar() Foo{
return &bar{}
}
如果bar
不满足Foo
,则无法编译。我没有添加构造来声明该类型实现了接口,而是确保 my 代码在某些时候将它用作接口。