浅解 go 语言的 interface(许的博客)
我写了一个 go interface 相关的代码转换为 C 代码的样例。也许有助于大家理解 go 的 interface。不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节。
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)
}
// -------------------------------------------------------------
#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(许的博客)的更多相关文章
- iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客
上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ...
- 2018上C语言程序设计(高级)博客作业样例
要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...
- WebConfig配置文件详解(转载自逆心的博客)
<?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...
- iOS中 支付宝钱包详解/第三方支付 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! iOS开发者交流QQ群: 446310206 一.在app中成功完成支付宝支付的过程 1.申请支付宝钱包.参考网址 ...
- 【转】log4j.properties 详解与配置步骤 - edward0830ly的专栏 - 博客频道 - CSDN.NET
一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...
- javascript工具--控制台详解(转自 阮一峰博客)
大神这篇博客是写在2011年,主要介绍 “Firefox” 浏览器插件 “Firebug” 的操作,如今主流浏览器对控制台都已经提供了很好的支持.我自己用的最多是谷歌的 “chrome” 浏览器,下面 ...
- 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)
一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账 ...
- C语言I博客作业02
这个作业属于那个课程 C语言程序设计I 这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/8656 我在这个课程的目标 ...
- c语言1博客作业02
c语言1博客作业02 这个作业属于哪个课程 C语言程序设计 这个作业的要求在哪 [作业要求](https://edu.cnblogs.com/campus/zswxy/SE2019-2/homewor ...
随机推荐
- C++大体概况 标签: c++总结 2015-01-31 20:41 792人阅读 评论(15) 收藏
今年又一次报名了二级的C++考试,现在再来把C++总结一下,也不能算是总结,大体提炼了一下需要注意的地方,考试之前打算把这些东西好好看一看,今年一定要过啊! 前两天才知道,unix是用C语言编写的,这 ...
- Java练习 SDUT-1188_各位数字之和排序
C语言实验--各位数字之和排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定n个正整数,根据各位数字之和从小到大 ...
- Java练习 SDUT-1239_水仙花数
水仙花数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花 ...
- SDUT-2116_数据结构实验之链表一:顺序建立链表
数据结构实验之链表一:顺序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个整数,按照输入的顺序建立单链 ...
- 开发板ping通虚拟机与主机
刚因为虚拟机与主机没法互相ping通的事情,奋战到将近凌晨一点.现在把这个过程总结一下,以方便后加入该行业的广大IT精英. VMWare提供了三种工作模式:bridged(桥接模式).NAT(网络地址 ...
- 【转载】字符编码笔记:ASCII,Unicode和UTF-8
字符编码笔记:ASCII,Unicode和UTF-8 作者: 阮一峰 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直 ...
- Uniapp使用iconfont
看别人的项目有各种各样的图标既好看占用内存还小 后来才知道原来有icon图标这个东西,原谅我真的一直处于混沌的状态. 刚好最近项目使用了uniapp框架,引入iconfont的方式和之前有些不太一样 ...
- python基础之包的导入
包的导入 python是一门灵活性的语言 ,也可以说python是一门胶水语言,顾名思义,就是可一导入各类的包, python的包可是说是所有语言中最多的.当然导入包大部分是为了更方便,更简便,效率更 ...
- hdu 2892 area (圆与多边形交面积)
Problem - 2892 这道题的做法是以圆心为原点,对多边形进行三角剖分.题目描述中,多边形的可能是顺时针或者是逆时针给出,不过在我的做法里,是用有向面积来计算的,和常见的多边形面积的求法类似, ...
- SuperSocket 服务器管理器客户端
SuperSocket 服务器管理器当前有两种类型的客户端, Silverlight客户端和WPF客户端.这两种客户端的代码都在源代码中的"Management"目录,你可以自行编 ...