接口的主要用法包含从类型赋值到接口,接口之间赋值和接口查询等。

类型赋值给接口

从一个简单的示例开始:
Go 接口机理 - 图1
实现逻辑:需要获取这个类型的所有方法集合(集合A),并获取该接口包含的所有方法集合(集合B),然后判断集合B是否为集合A的子集,是则意味着该类型实现了该接口。

接口查询

按Go语言的定义,接口查询其实是在做接口方法查询,只要该类型实现了某个接口的所有方法,就可以认为该类型实现了此接口。相比类型赋值给接口时可以做的编译期优化,运行期接口查询就只能老老实实地做一次匹配了。下面我们来看一下基本的匹配过程:
Go 接口机理 - 图2
这是一个动态的接口匹配过程。这个流程就是按接口信息表中包含的方法名逐一查询匹配,如果发现传入的类型信息ti的方法列表是intf的方法列表的超集(即intf方法列表中的所有方法都存在ti方法列表中),则表示接口查询成功。

从这个过程可以看到,整个过程其实跟发起查询的那个源接口毫无关系,真正的查询是针对源接口所指向的具体类型以及目标接口。

接口赋值

接口赋值,就是将一个接口直接赋值给另外一个接口。能否赋值成功的依据是源接口和目标接口是否存在方法集合的包含关系。


Go 接口机理 - 图3