go lang学习笔记——接口

本文详细阐述了Go语言中接口的数据结构、基本操作及其实现原理,包括接口与类型之间的赋值、查询和赋值算法,通过简化书中代码描述接口的内部工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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之间的是否适合一个是另一个的超集的关系。

    • 成立则可赋值
    • 不成立则不可赋值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值