浅解 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;
}
 
  
// -------------------------------------------------------------
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值