go接口非常强大,除了作为一般的接口使用外。它还是go的运行时多态的基础。更能提供超越boost::any的能力。许式伟的《go语言编程》一书中有对接口的机制作较深入的剖析和介绍。
结合书中描述再加上我自己的理解。整理了一下go接口的数据结构和基本操作的描述。
有必要说明的是,以下结构引用的部分书中代码,并且做了极大的精减,只为了能用最简单的方式描述并理解go接口的实现原理。如果我的理解和实现情况相差千里,还望指正。
类型的数据结构
typedef struct _MemberInfo {
const char * tag; // 方法原型
void * addr; // 方法地址(函数入口地址)
} MemberInfo;
typedef struct _TypeInfo {
MemberInfo* members[]; // 成员数组
} TypeInfo;
接口的数据结构
typedef struct _InterfaceMemberInfo {
const char** tags;
} InterfaceMemberInfo;
// 接口
typedef struct _Interface {
InterfaceMemberInfo* inter;
TypeInfo* type;
//...
} Interface;
接口和类型的数据结构示意图如下:
接口操作算法
类型赋值给接口
很简单,检查类型的MemberInfo结构里的tags是不是接口的InterfaceMemberInfo结构里的tags的超集
- yes, 就让接口的typeinfo指向该类型
- no, 不能赋值,既该类型没有实现接口
接口查询
直接检查接口的typeinfo指向的类型的数据结构
- 如果找到匹配的内容接口查询成功
- 如果没有匹配的内容查询失败
接口赋值
依然是比较InterfaceMemberInfo结构里的tags之间的是否适合一个是另一个的超集的关系。
- 成立则可赋值
- 不成立则不可赋值
有疑问加站长微信联系(非本文作者)