我写了一个 go interface 相关的代码转换为 C 代码的样例。也许有助于大家理解 go 的 interface。不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节。

 
Go 代码:
 
package main

import "fmt"

// -------------------------------------------------------------

type IReadWriter interface {
    Read(buf *byte, cb int) int
    Write(buf *byte, cb int) int
}

// -------------------------------------------------------------

type A struct {
    a int
}

func NewA(params int) *A {
    fmt.Println("NewA:", params);
    return &A{params}
}

func (this *A) Read(buf *byte, cb int) int {
    fmt.Println("A_Read:", this.a)
    return cb
}

func (this *A) Write(buf *byte, cb int) int {
    fmt.Println("A_Write:", this.a)
    return cb
}

// -------------------------------------------------------------

type B struct {
    A
}

func NewB(params int) *B {
    fmt.Println("NewB:", params);
    return &B{A{params}}
}

func (this *B) Write(buf *byte, cb int) int {
    fmt.Println("B_Write:", this.a)
    return cb
}

func (this *B) Foo() {
    fmt.Println("B_Foo:", this.a)
}

// -------------------------------------------------------------

func main() {
    var p IReadWriter = NewB(8)
    p.Read(nil, 10)
    p.Write(nil, 10)
}

// -------------------------------------------------------------

 
 
对应的 C 代码:
 
 
#include <stdio.h>
#include <stdlib.h>

// -------------------------------------------------------------

typedef struct _TypeInfo {
    // 用于运行时取得类型信息, 比如反射机制
} TypeInfo;

typedef struct _InterfaceInfo {
    // 用于运行时取得interface信息
} InterfaceInfo;

// -------------------------------------------------------------

typedef struct _IReadWriterTbl {
    InterfaceInfo* inter;
    TypeInfo* type;
    int (*Read)(void* this, char* buf, int cb);
    int (*Write)(void* this, char* buf, int cb);
} IReadWriterTbl;

typedef struct _IReadWriter {
    IReadWriterTbl* tab;
    void* data;
} IReadWriter;

InterfaceInfo g_InterfaceInfo_IReadWriter = {
    // ...    
};

// -------------------------------------------------------------

typedef struct _A {
    int a;
} A;

int A_Read(A* this, char* buf, int cb) {
    printf("A_Read: %d\n", this->a);
    return cb;
}

int A_Write(A* this, char* buf, int cb) {
    printf("A_Write: %d\n", this->a);
    return cb;
}

TypeInfo g_TypeInfo_A = {
    // ...    
};

A* NewA(int params) {
    printf("NewA: %d\n", params);
    A* this = (A*)malloc(sizeof(A));
    this->a = params;
    return this;
}

// -------------------------------------------------------------

typedef struct _B {
    A base;
} B;

int B_Write(B* this, char* buf, int cb) {
    printf("B_Write: %d\n", this->base.a);
    return cb;
}

void B_Foo(B* this) {
    printf("B_Foo: %d\n", this->base.a);
}

TypeInfo g_TypeInfo_B = {
    // ...    
};

B* NewB(int params) {
    printf("NewB: %d\n", params);
    B* this = (B*)malloc(sizeof(B));
    this->base.a = params;
    return this;
}

// -------------------------------------------------------------

IReadWriterTbl g_Itbl_IReadWriter_B = {
    &g_InterfaceInfo_IReadWriter,
    &g_TypeInfo_B,
    (int (*)(void* this, char* buf, int cb))A_Read,
    (int (*)(void* this, char* buf, int cb))B_Write
};

int main() {

    B* unnamed = NewB(8);
    IReadWriter p = {
        &g_Itbl_IReadWriter_B,
        unnamed
    };

    p.tab->Read(p.data, NULL, 10);
    p.tab->Write(p.data, NULL, 10);

    return 0;
}

// -------------------------------------------------------------

http://blog.csdn.net/xushiweizh/article/details/7034346

浅解 go 语言的 interface(许的博客)的更多相关文章

  1. iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客

    上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ...

  2. 2018上C语言程序设计(高级)博客作业样例

    要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...

  3. WebConfig配置文件详解(转载自逆心的博客)

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  4. iOS中 支付宝钱包详解/第三方支付 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发者交流QQ群: 446310206 一.在app中成功完成支付宝支付的过程 1.申请支付宝钱包.参考网址 ...

  5. 【转】log4j.properties 详解与配置步骤 - edward0830ly的专栏 - 博客频道 - CSDN.NET

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  6. javascript工具--控制台详解(转自 阮一峰博客)

    大神这篇博客是写在2011年,主要介绍 “Firefox” 浏览器插件 “Firebug” 的操作,如今主流浏览器对控制台都已经提供了很好的支持.我自己用的最多是谷歌的 “chrome” 浏览器,下面 ...

  7. 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)

    一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账 ...

  8. C语言I博客作业02

    这个作业属于那个课程  C语言程序设计I 这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/8656 我在这个课程的目标 ...

  9. c语言1博客作业02

    c语言1博客作业02 这个作业属于哪个课程 C语言程序设计 这个作业的要求在哪 [作业要求](https://edu.cnblogs.com/campus/zswxy/SE2019-2/homewor ...

随机推荐

  1. Effective C++: 01让自己习惯C++

    01:视C++为一个语言联邦 1:今天的C++已经是个多重范型编程语言(multiparadigm programming language),一个同时支持过程形式(procedural).面向对象形 ...

  2. 容器化ICT融合初体验

    [编者的话]本次将分享的容器化ICT融合平台是一种面向未来ICT系统的新型云计算PaaS平台,它基于容器这一轻量级的虚拟化技术以及自动化的"微服务"管理架构,能够有效支撑应用快速上 ...

  3. 阿里开源!轻量级深度学习端侧推理引擎 MNN

    阿里妹导读:近日,阿里正式开源轻量级深度学习端侧推理引擎“MNN”. AI科学家贾扬清如此评价道:“与 Tensorflow.Caffe2 等同时覆盖训练和推理的通用框架相比,MNN 更注重在推理时的 ...

  4. docfx 做一个和微软一样的文档平台

    开发中,有一句话叫 最不喜欢的是写文档,最不喜欢的是看别人家代码没有文档.那么世界上文档写最 la 好 ji 的就是微软了,那么微软的api文档是如何做的?难道请了很多人去写文档? 实际上微软有工具用 ...

  5. 08Redis入门指南笔记(集群)

    即使使用哨兵,此时的 Redis 集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于所有节点中,内存最小的数据库节点,形成木桶效应. 对 Redis 进行水平扩容,在旧版Red ...

  6. 《attention is all you need》解读

    Motivation: 靠attention机制,不使用rnn和cnn,并行度高 通过attention,抓长距离依赖关系比rnn强 创新点: 通过self-attention,自己和自己做atten ...

  7. Laravel5.2 发送邮件(smtp方式最简单的讲解!)-邮件部分

    https://blog.csdn.net/wulove52/article/details/71172842 Laravel集成了SwiftMailer库进行邮件发送,邮件配置文件位于config/ ...

  8. git 生成秘钥连接远程仓库

    二.打开GitBash ,用cd命令进入本地项目目,然后把初始化一下,把本地的目录变成git本地仓库, git status 可以查看本地目录的状态信息 git init git status 三.将 ...

  9. 用mysql查询某字段是否有索引

    可以使用SHOW INDEX FROM table_name来查看表的索引,从而查看字段的索引:查询结果中table为表名,key_name为索引名,Column_name为列名

  10. iptables单个规则实例

    iptables -F? # -F 是清除的意思,作用就是把 FILTRE TABLE 的所有链的规则都清空 iptables -A INPUT -s 172.20.20.1/32 -m state ...