[置顶] 浅解 go 语言的 interface

时间:2021-12-15 11:49:24
我写了一个 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;
}

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