您好,登錄后才能下訂單哦!
本篇文章為大家展示了Go語言中iface和eface的區別有什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
iface和eface都是Go中描述接口的底層結構體,區別在于iface描述的接口包含方法,而eface則是不包含任何方法的空接口:interface{}。
iface內部維護兩個指針,tab指向一個itab實體,它表示接口的類型以及賦給這個接口的實體類型。data則指向接口具體的值,一般而言是一個指向堆內存的指針。
再來仔細看一下itab結構體:_type字段描述了實體的類型,包括內存對齊方式,大小等;inter字段則描述了接口的類型。fun字段放置和接口方法對應的具體數據類型的方法地址,實現接口調用方法的動態分派,一般在每次給接口賦值發生轉換時會更新此表,或者直接拿緩存的itab。
這里只會列出實體類型和接口相關的方法,實體類型的其他方法并不會出現在這里。如果你學過C++的話,這里可以類比虛函數的概念。
另外,你可能會覺得奇怪,為什么fun數組的大小為1,要是接口定義了多個方法可怎么辦?實際上,這里存儲的是第一個方法的函數指針,如果有更多的方法,在它之后的內存空間里繼續存儲。從匯編角度來看,通過增加地址就能獲取到這些函數指針,沒什么影響。順便提一句,這些方法是按照函數名稱的字典序進行排列的。
再看一下interfacetype類型,它描述的是接口的類型:
可以看到,它包裝了_type類型,_type實際上是描述Go語言中各種數據類型的結構體。我們注意到,這里還包含一個mhdr字段,表示接口所定義的函數列表,pkgpath記錄定義了接口的包名。
相比iface,eface就比較簡單了。只維護了一個_type字段,表示空接口所承載的具體的實體類型。data描述了具體的值。
Go語言各種數據類型都是在_type字段的基礎上,增加一些額外的字段來進行管理的:
type chantype struct {typ _typeelem *_typedir uintptr}
type slicetype struct {typ _typeelem *_type}
type structtype struct {typ _typepkgPath namefields []structfield}
這些數據類型的結構體定義,是反射實現的基礎。
上述內容就是Go語言中iface和eface的區別有什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。