亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

GoLang中的iface?和?eface?的區(qū)別解析

 更新時(shí)間:2022年09月30日 14:28:53   作者:~龐貝  
iface 和 eface 都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下

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

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

從源碼層面看一下:

type iface struct {
	tab  *itab
	data unsafe.Pointer
}

type itab struct {
	inter  *interfacetype
	_type  *_type
	link   *itab
	hash   uint32 // copy of _type.hash. Used for type switches.
	bad    bool   // type does not implement interface
	inhash bool   // has this itab been added to hash?
	unused [2]byte
	fun    [1]uintptr // variable sized
}

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

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

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

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

再看一下 interfacetype 類(lèi)型,它描述的是接口的類(lèi)型:

type interfacetype struct {
	typ     _type
	pkgpath name
	mhdr    []imethod
}

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

這里通過(guò)一張圖來(lái)看下 iface 結(jié)構(gòu)體的全貌:

iface 結(jié)構(gòu)體全景

接著來(lái)看一下 eface 的源碼:

type eface struct {
    _type *_type
    data  unsafe.Pointer
}

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

eface 結(jié)構(gòu)體全景

我們來(lái)看個(gè)例子:

package main

import "fmt"

func main() {
	x := 200
	var any interface{} = x
	fmt.Println(any)

	g := Gopher{"Go"}
	var c coder = g
	fmt.Println(c)
}

type coder interface {
	code()
	debug()
}

type Gopher struct {
	language string
}

func (p Gopher) code() {
	fmt.Printf("I am coding %s language\n", p.language)
}

func (p Gopher) debug() {
	fmt.Printf("I am debuging %s language\n", p.language)
}

執(zhí)行命令,打印出匯編語(yǔ)言:

go tool compile -S ./src/main.go

可以看到,main 函數(shù)里調(diào)用了兩個(gè)函數(shù):

func convT2E64(t *_type, elem unsafe.Pointer) (e eface)
func convT2I(tab *itab, elem unsafe.Pointer) (i iface)

上面兩個(gè)函數(shù)的參數(shù)和 ifaceeface 結(jié)構(gòu)體的字段是可以聯(lián)系起來(lái)的:兩個(gè)函數(shù)都是將參數(shù)組裝一下,形成最終的接口。

作為補(bǔ)充,我們最后再來(lái)看下 _type 結(jié)構(gòu)體:

type _type struct {
    // 類(lèi)型大小
	size       uintptr
    ptrdata    uintptr
    // 類(lèi)型的 hash 值
    hash       uint32
    // 類(lèi)型的 flag,和反射相關(guān)
    tflag      tflag
    // 內(nèi)存對(duì)齊相關(guān)
    align      uint8
    fieldalign uint8
    // 類(lèi)型的編號(hào),有bool, slice, struct 等等等等
	kind       uint8
	alg        *typeAlg
	// gc 相關(guān)
	gcdata    *byte
	str       nameOff
	ptrToThis typeOff
}

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

type arraytype struct {
	typ   _type
	elem  *_type
	slice *_type
	len   uintptr
}

type chantype struct {
	typ  _type
	elem *_type
	dir  uintptr
}

type slicetype struct {
	typ  _type
	elem *_type
}

type structtype struct {
	typ     _type
	pkgPath name
	fields  []structfield
}

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

到此這篇關(guān)于GoLang之iface 和 eface 的區(qū)別是什么的文章就介紹到這了,更多相關(guān)GoLang iface 和 eface區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • GoFrame框架使用避坑指南和實(shí)踐干貨

    GoFrame框架使用避坑指南和實(shí)踐干貨

    這篇文章主要為大家介紹了GoFrame框架使用避坑指南和實(shí)踐干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go GORM版本2.0新特性介紹

    Go GORM版本2.0新特性介紹

    這篇文章主要為大家介紹了Go GORM版本2.0新特性的使用示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • gin 獲取post請(qǐng)求的json body操作

    gin 獲取post請(qǐng)求的json body操作

    這篇文章主要介紹了gin 獲取post請(qǐng)求的json body操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • go NewTicker的用法示例代碼

    go NewTicker的用法示例代碼

    在 Go 語(yǔ)言中,time.NewTicker函數(shù)用于創(chuàng)建一個(gè)周期性觸發(fā)的定時(shí)器,這篇文章主要介紹了go NewTicker的使用,需要的朋友可以參考下
    2023-07-07
  • Golang基礎(chǔ)常識(shí)性面試中常見(jiàn)的六大陷阱及應(yīng)對(duì)技巧總結(jié)

    Golang基礎(chǔ)常識(shí)性面試中常見(jiàn)的六大陷阱及應(yīng)對(duì)技巧總結(jié)

    Go是一門(mén)簡(jiǎn)單有趣的語(yǔ)言,但與其他語(yǔ)言類(lèi)似,它會(huì)有一些技巧,這篇文章主要給大家介紹了關(guān)于Golang基礎(chǔ)常識(shí)性面試中常見(jiàn)的六大陷阱及應(yīng)對(duì)技巧的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Go語(yǔ)言包管理工具dep的安裝與使用

    Go語(yǔ)言包管理工具dep的安裝與使用

    godep是解決包依賴(lài)的管理工具,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言包管理工具dep的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • windows下使用vscode搭建golang環(huán)境并調(diào)試的過(guò)程

    windows下使用vscode搭建golang環(huán)境并調(diào)試的過(guò)程

    這篇文章主要介紹了在windows下使用vscode搭建golang環(huán)境并進(jìn)行調(diào)試,主要包括安裝方法及環(huán)境變量配置技巧,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Go中runtime.Caller的使用

    Go中runtime.Caller的使用

    這篇文章主要介紹了Go中runtime.Caller的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • 一文帶你理解Go語(yǔ)言中方法的本質(zhì)

    一文帶你理解Go語(yǔ)言中方法的本質(zhì)

    我們知道,Go語(yǔ)言從設(shè)計(jì)伊始,就不支持經(jīng)典的面向?qū)ο笳Z(yǔ)法元素,但?Go?語(yǔ)言仍保留了名為“方法(method)”的語(yǔ)法元素,下面我們就來(lái)帶大家深入了解一下Go語(yǔ)言中的方法吧
    2023-11-11
  • Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換

    Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換

    這篇文章主要介紹了Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論