Go-如何明确声明结构正在实现接口?

问题描述 投票:6回答:3

由于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)

这些方法正确吗,或者还有其他方法可以做这样的事情?

inheritance go interface standards
3个回答
8
投票

方法2是正确的方法,方法1您只是嵌入类型并覆盖其功能。如果忘记覆盖它,则将以nil指针取消引用结束。


2
投票

我很少需要声明这一点,因为在我的包中几乎总是存在将struct用作接口的地方。我倾向于遵循这样的模式:在可能的情况下不暴露结构,仅通过“构造函数”功能提供它们。

type Foo interface{
  Foo()
}

type bar struct {}
func (b *bar)Foo() {}

func NewBar() Foo{
  return &bar{}
}

如果bar不满足Foo,则不会编译。我只需要确保my代码在某个时候将其用作接口,而不是添加构造来声明该类型已实现该接口。


1
投票

您不能。在Go中,所有接口实现都是隐式的。您可以检查类型是否实现了接口(这是它获得的最明确的接口)。如果我在工作的项目中正确记得,我们只是在程序包的顶部针对实现类型的接口做了一些类型断言,这与它得到的显性值非常接近。

© www.soinside.com 2019 - 2024. All rights reserved.