浅解 go 语言的 interface

原创 2011年12月02日 11:37:32
我写了一个 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;
}

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

Go语言基础:Interface

转:http://xhrwang.me/2014/12/29/golang-fundamentals-8-interface.html我们知道 Golang 中没有 class 的概念,而是通过 in...
  • uudou
  • uudou
  • 2016-09-07 07:38:46
  • 4493

【GoLang笔记】浅析Go语言Interface类型的语法行为及用法

Go不是一种典型的OO语言,它在语法上不支持类和继承的概念。 没有继承是否就无法拥有多态行为了呢?答案是否定的,Go语言引入了一种新类型—Interface,它在效果上实现了类似于C++的“多态”概念...
  • slvher
  • slvher
  • 2015-03-20 15:28:13
  • 5881

Go语言interface的value.(type)使用小技巧

package main import ( "container/list" "fmt" "os" "sync" "time" ) type INFO struct { lock sy...
  • fyxichen
  • fyxichen
  • 2015-07-10 18:13:25
  • 1584

go中的interface

用了9年的C++,1年的C#,最近改用go语言开发,深感go语言的设计简单,其设计宗旨也是less is more,它极大的加快了开发速度。 go语言吸取了很多现代语言的优点,一个比较重要的特性就是...
  • jacob_007
  • jacob_007
  • 2016-12-10 10:57:28
  • 1936

Go语言 nil和interface详解

golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在golang中,nil只能赋值给指针、chann...
  • abv123456789
  • abv123456789
  • 2014-04-20 09:48:54
  • 1852

Go语言基础:深入理解 struct 内嵌 inteface

对上一篇文章用到的匿名接口的深入理解:http://blog.csdn.net/uudou/article/details/52456133 对于 struct 内嵌 inteface 的使用,我是...
  • uudou
  • uudou
  • 2016-09-16 18:08:29
  • 3325

测试Go语言的interface的效率

interface是Go语言中的一大特点,甚至说是灵魂也不为过。 interface应该会在Go程序中大量出现和使用,因为有必要了解和测试下它的效率。 测试思路: 使用vector包,测...
  • hengyunabc
  • hengyunabc
  • 2012-07-10 11:57:22
  • 3122

go interface 转 string,解析json

package main import ( "encoding/json" "fmt" ) var user map[string]interface{} func main() { us...
  • aqiang912
  • aqiang912
  • 2015-09-29 12:02:52
  • 992

go语言将函数作为参数传递

go语言函数作为参数传递,目前给我的感觉几乎和C/C++一致。非常的灵活。 import "fmt" import "time" func goFunc1(f func()) { ...
  • eclipser1987
  • eclipser1987
  • 2013-09-17 15:06:20
  • 14740

Go语言_类型转换_interface与强类型(int,string...)转换

Go语言是门强类型语言,因此也导致了非常多的问题, interface{} 任意类型 不能随意的转换为其他类型 若要进行类型转换,需要进行类型的断言 示例代码: // Convert p...
  • u010003835
  • u010003835
  • 2016-06-28 17:18:41
  • 10494
收藏助手
不良信息举报
您举报文章:浅解 go 语言的 interface
举报原因:
原因补充:

(最多只允许输入30个字)