为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
三国纷争 2021-10-25 18:33:40
由于 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)这些方法是正确的,还是有其他方法可以做这样的事情?
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-10-25
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我很少需要声明这一点,因为在我的包中几乎总是有我使用结构体作为接口的地方。我倾向于遵循在可能的情况下保持结构不公开的模式,并且仅通过“构造函数”函数提供它们。


type Foo interface{

  Foo()

}


type bar struct {}

func (b *bar)Foo() {}


func NewBar() Foo{

  return &bar{}

}

如果bar不满足Foo,则不会编译。我没有添加构造来声明该类型实现了接口,而是确保我的代码在某个时候将它用作接口。


查看完整回答
反对 回复 2021-10-25
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信