91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

林州市| 镶黄旗| 巨鹿县| 樟树市| 吴忠市| 宝兴县| 贵州省| 瓮安县| 宁强县| 大安市| 宁晋县| 酉阳| 迁安市| 吉林省| 封丘县| 腾冲县| 久治县| 定西市| 柞水县| 连平县| 河源市| 闽侯县| 溧阳市| 同心县| 巩留县| 广水市| 阿拉善左旗| 镇宁| 原阳县| 安康市| 甘德县| 桐城市| 丹巴县| 专栏| 瓦房店市| 大新县| 日土县| 静乐县| 云阳县| 无极县| 大名县|