浅解 go 语言的 interface

我写了一个 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;
}
 
  
// -------------------------------------------------------------
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值