亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中iface和eface的區別有什么

發布時間:2021-07-20 15:34:28 來源:億速云 閱讀:242 作者:Leah 欄目:編程語言

本篇文章為大家展示了Go語言中iface和eface的區別有什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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的區別有什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

十堰市| 龙江县| 鹰潭市| 新和县| 宜良县| 绍兴市| 芦溪县| 宝兴县| 巩义市| 长海县| 高清| 红原县| 泰安市| 江源县| 迁西县| 长顺县| 当涂县| 德钦县| 盱眙县| 淳化县| 静乐县| 泰和县| 花莲市| 哈尔滨市| 乐至县| 滦平县| 乾安县| 广东省| 镇远县| 蒙自县| 万源市| 昌都县| 建始县| 宁南县| 光山县| 应城市| 始兴县| 南汇区| 香港| 德清县| 延长县|