go lang學習筆記——介面

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

go介面非常強大,除了作為一般的介面使用外。它還是go的運行時多態的基礎。更能提供超越boost::any的能力。許式偉的《go語言編程》一書中有對介面的機製作較深入的剖析和介紹。
結合書中描述再加上我自己的理解。整理了一下go介面的資料結構和基本操作的描述。
有必要說明的是,以下結構引用的部分書中代碼,並且做了極大的精減,只為了能用最簡單的方式描述並理解go介面的實現原理。如果我的理解和實現情況相差千裡,還望指正。

類型的資料結構

typedef struct _MemberInfo {    const char * tag;    // 方法原型    void * addr;            // 方法地址(函數入口地址)} MemberInfo;typedef struct _TypeInfo {    MemberInfo* members[];  // 成員數組} TypeInfo;

介面的資料結構

typedef struct _InterfaceMemberInfo {    const char** tags;} InterfaceMemberInfo;// 介面typedef struct _Interface {    InterfaceMemberInfo* inter;    TypeInfo* type;//...} Interface;

介面和類型的資料結構如下:

介面操作演算法

  1. 類型賦值給介面

    很簡單,檢查類型的MemberInfo結構裡的tags是不是介面的InterfaceMemberInfo結構裡的tags的超集

    • yes, 就讓介面的typeinfo指向該類型
    • no, 不能賦值,既該類型沒有實現介面
  2. 介面查詢

    直接檢查介面的typeinfo指向的類型的資料結構

    • 如果找到匹配的內容介面查詢成功
    • 如果沒有匹配的內容查詢失敗
  3. 介面賦值

    依然是比較InterfaceMemberInfo結構裡的tags之間的是否適合一個是另一個的超集的關係。

    • 成立則可賦值
    • 不成立則不可賦值

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.