go lang学习笔记——接口

nobugtodebug · · 1578 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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;

接口和类型的数据结构示意图如下:
接口和类型的数据结构示意图

接口操作算法

  1. 类型赋值给接口

    很简单,检查类型的MemberInfo结构里的tags是不是接口的InterfaceMemberInfo结构里的tags的超集

    • yes, 就让接口的typeinfo指向该类型
    • no, 不能赋值,既该类型没有实现接口
  2. 接口查询

    直接检查接口的typeinfo指向的类型的数据结构

    • 如果找到匹配的内容接口查询成功
    • 如果没有匹配的内容查询失败
  3. 接口赋值

    依然是比较InterfaceMemberInfo结构里的tags之间的是否适合一个是另一个的超集的关系。

    • 成立则可赋值
    • 不成立则不可赋值

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:nobugtodebug

查看原文:go lang学习笔记——接口

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1578 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传