Golang 中能否知道一个类型实现了哪些接口

golang 源码中如何看一个struct实现了哪些interface?

地址:https://www.zhihu.com/question/350240343/answer/855103520

我的回答

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。


补充:抽时间研究下一些类型检查工具是怎么实现的,比如 go/types,ast 等。