猿问

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

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

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


三国纷争
浏览 211回答 3
3回答

千万里不及你

方法 2 是正确的,方法 1 您只是嵌入一种类型并覆盖其功能。如果你忘记覆盖它,你最终会得到一个 nil 指针解引用。

慕哥9229398

我很少需要声明这一点,因为在我的包中几乎总是有我使用结构体作为接口的地方。我倾向于遵循在可能的情况下保持结构不公开的模式,并且仅通过“构造函数”函数提供它们。type Foo interface{  Foo()}type bar struct {}func (b *bar)Foo() {}func NewBar() Foo{  return &bar{}}如果bar不满足Foo,则不会编译。我没有添加构造来声明该类型实现了接口,而是确保我的代码在某个时候将它用作接口。

梵蒂冈之花

你不能。在 Go 中,所有接口实现都是隐式的。你可以检查一个类型是否实现了一个接口(这是它得到的最明确的)。如果我在我从事的项目中没有记错的话,我们只是在包的顶部针对类型实现的接口做了一些类型断言,这与它所得到的一样接近显式。
随时随地看视频慕课网APP

相关分类

Go
我要回答