如何将golang结构标记为实现接口?

31

我有一个接口:

  type MyInterface interface {
  ...
  }

我想标记一下我的结构体实现了它。我认为在go语言中这是不可能的,但我想确认一下。

我尝试了以下方式,但我认为它会产生一个实现接口的匿名变量。我理解正确吗?

  type MyStruct struct {
    ...
    MyInterface
  }

10
Go FAQ: 为什么 Go 没有 "implements" 声明? 答案是:在 Go 中,实现接口只需要满足接口中定义的所有方法。不需要显式地声明一个类型实现了某个接口。如何确保我的类型满足一个接口?可以通过编写针对该接口的单元测试来检测类型是否满足接口。这种方式称为“表格驱动测试”,其中用例列表作为输入,并针对每个用例执行相同的测试逻辑。如果类型未能满足接口,则测试将失败并指出哪些方法没有被正确实现。 - icza
这个回答解决了你的问题吗?在Go中编译时确保类型实现接口 - user12817546
这个回答解决了你的问题吗?Go - 如何明确声明一个结构体实现了一个接口? - SOFe
1个回答

70
在Go语言中,实现接口是隐式的。无需显式地标记它作为接口的实现。虽然它有些不同,但您可以使用赋值来测试类型是否实现了接口,并且如果不是,则会产生编译时错误。它的样子如下(来自Go FAQ页面的示例);
type T struct{}
var _ I = T{}       // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.

回答你的第二个问题,是的,这意味着你的结构体由实现该接口的类型组成。

3
谢谢,这是我多年来在GO语言工具箱中保留的最佳技巧之一。 - Sergei G
嗨,这可能是一个线程,但如果实现是这样的,你如何实现设计模式?它仍然可能吗? - sshanzel
这非常有帮助。感谢您提供的检查缺失方法的技巧。 - Parth Verma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接