溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語言中iface和eface的區(qū)別有什么

發(fā)布時(shí)間:2021-07-20 15:34:28 來源:億速云 閱讀:241 作者:Leah 欄目:編程語言

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

iface和eface的區(qū)別是什么

  iface和eface都是Go中描述接口的底層結(jié)構(gòu)體,區(qū)別在于iface描述的接口包含方法,而eface則是不包含任何方法的空接口:interface{}。

  iface內(nèi)部維護(hù)兩個(gè)指針,tab指向一個(gè)itab實(shí)體,它表示接口的類型以及賦給這個(gè)接口的實(shí)體類型。data則指向接口具體的值,一般而言是一個(gè)指向堆內(nèi)存的指針。

  再來仔細(xì)看一下itab結(jié)構(gòu)體:_type字段描述了實(shí)體的類型,包括內(nèi)存對(duì)齊方式,大小等;inter字段則描述了接口的類型。fun字段放置和接口方法對(duì)應(yīng)的具體數(shù)據(jù)類型的方法地址,實(shí)現(xiàn)接口調(diào)用方法的動(dòng)態(tài)分派,一般在每次給接口賦值發(fā)生轉(zhuǎn)換時(shí)會(huì)更新此表,或者直接拿緩存的itab。

  這里只會(huì)列出實(shí)體類型和接口相關(guān)的方法,實(shí)體類型的其他方法并不會(huì)出現(xiàn)在這里。如果你學(xué)過C++的話,這里可以類比虛函數(shù)的概念。

  另外,你可能會(huì)覺得奇怪,為什么fun數(shù)組的大小為1,要是接口定義了多個(gè)方法可怎么辦?實(shí)際上,這里存儲(chǔ)的是第一個(gè)方法的函數(shù)指針,如果有更多的方法,在它之后的內(nèi)存空間里繼續(xù)存儲(chǔ)。從匯編角度來看,通過增加地址就能獲取到這些函數(shù)指針,沒什么影響。順便提一句,這些方法是按照函數(shù)名稱的字典序進(jìn)行排列的。

  再看一下interfacetype類型,它描述的是接口的類型:

  可以看到,它包裝了_type類型,_type實(shí)際上是描述Go語言中各種數(shù)據(jù)類型的結(jié)構(gòu)體。我們注意到,這里還包含一個(gè)mhdr字段,表示接口所定義的函數(shù)列表,pkgpath記錄定義了接口的包名。

  相比iface,eface就比較簡單了。只維護(hù)了一個(gè)_type字段,表示空接口所承載的具體的實(shí)體類型。data描述了具體的值。

  Go語言各種數(shù)據(jù)類型都是在_type字段的基礎(chǔ)上,增加一些額外的字段來進(jìn)行管理的:

  type chantype struct {typ _typeelem *_typedir uintptr}

  type slicetype struct {typ _typeelem *_type}

  type structtype struct {typ _typepkgPath namefields []structfield}

  這些數(shù)據(jù)類型的結(jié)構(gòu)體定義,是反射實(shí)現(xiàn)的基礎(chǔ)。

上述內(nèi)容就是Go語言中iface和eface的區(qū)別有什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI