浅解 go 语言的 interface

来源:互联网 发布:什么是电子数据交换 编辑:程序博客网 时间:2024/05/18 19:21
我写了一个 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;
}
// -------------------------------------------------------------
原创粉丝点击