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
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    TiFlash:并非另一个 T + 1 列存数据库
    单图说TDSQL;OceanBase 2.2 事务引擎核心功能;穿云箭2.0版发布;RMAN DUPLICATE配置19C DG;外键上有无索引的影响;MySQL8.0 索引新功能;GaussDB C
    tcpdump 看到 报文长度超过MSS
    TCP 最大段大小(Max Segment Size,MSS) 最大段大小
    Hack The Box——Traceback
    如何设置don't fragment (DF) flag 在socket上? (实际模拟路径 MTU 发现)
    MTU=1500 1460数据为什么要发2次?
    MTU=1500,单个报文段最大值为1448
    MTU 1500 发送1448数据
  • 原文地址:https://www.cnblogs.com/findumars/p/6376052.html
Copyright © 2011-2022 走看看