Go 是通过隐式接口机制实现的鸭子模型,什么意思?就是你不知道一个类型实现了什么接口,只要满足方法集即实现了这个接口。所以,一个 struct 实现了哪些接口类型,这是不可能知道的,除非你指定了一个可供测试的接口的范围。
举个例子。有如下一个类型:
type D struct {}
func (d *D) Method1() {}
func (d *D) Method2() {}
func (d *D) Method3() {}
func (d *D) Method4() {}
它实现了那些 interface 呢?下面这些接口都满足。
type I1 interface {
Method1()
}
type I2 interface {
Method2()
}
type I3 interface {
Method3()
}
type I4 interface {
Method4()
}
接口名称还会是任意的,比如:
type I1New interface {
Method1()
}
同样是支持 Method1 的接口,但名称可能完全不同。
还有,这些方法还可以随便组合就可以形成不同的接口。比如:
type I12 interface {
Method1()
Method2()
}
type I34 interface {
Method3()
Method4()
}
当然,如果给定了一个有限范围的接口类型,测试一个类型是否实现了某个接口还是非常简单的。
还有一点,其他答主说的,任何命名类型都可实现 Go 的接口,不一定是结构体。这里的 type D struct {} 也可以能是 type D int。