這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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;
介面和類型的資料結構如下:
介面操作演算法
類型賦值給介面
很簡單,檢查類型的MemberInfo結構裡的tags是不是介面的InterfaceMemberInfo結構裡的tags的超集
- yes, 就讓介面的typeinfo指向該類型
- no, 不能賦值,既該類型沒有實現介面
介面查詢
直接檢查介面的typeinfo指向的類型的資料結構
- 如果找到匹配的內容介面查詢成功
- 如果沒有匹配的內容查詢失敗
介面賦值
依然是比較InterfaceMemberInfo結構裡的tags之間的是否適合一個是另一個的超集的關係。