zoukankan      html  css  js  c++  java
  • 浅解 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
    ", this->a);
        return cb;
    }
    
    
    int A_Write(A* this, char* buf, int cb) {
        printf("A_Write: %d
    ", this->a);
        return cb;
    }
    
    
    TypeInfo g_TypeInfo_A = {
        // ...    
    };
    
    
    A* NewA(int params) {
        printf("NewA: %d
    ", 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
    ", this->base.a);
        return cb;
    }
    
    
    void B_Foo(B* this) {
        printf("B_Foo: %d
    ", this->base.a);
    }
    
    
    TypeInfo g_TypeInfo_B = {
        // ...    
    };
    
    
    B* NewB(int params) {
        printf("NewB: %d
    ", 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
  • 相关阅读:
    51Nod 1006 最长公共子序列Lcs
    输入和输出
    51Nod 1092 回文字符串
    51Nod 1050 循环数组最大子段和
    项目初始
    一元多项式求导 (25)
    说反话 (20)
    数组元素循环右移问题 (20)
    素数对猜想 (20)
    换个格式输出整数 (15)
  • 原文地址:https://www.cnblogs.com/findumars/p/6376052.html
Copyright © 2011-2022 走看看