[TOC]
## interface底層結構

* `runtime.eface`?結構體:表示不包含任何方法的空接口,也稱為 empty interface。
* `runtime.iface`?結構體:表示包含方法的接口。
**只有當interface 的 type和data 都是nil的時候才是nil,有一個不是nil,就不能判斷是不是nil**
### runtime.eface
```
type?eface?struct?{
?_type?*_type //類型
?data??unsafe.Pointer // 值的指針
}
//type的結構體
type?_type?struct?{
?size???????uintptr
?ptrdata????uintptr?
hash???????uint32
?tflag??????tflag
?align??????uint8
?fieldAlign?uint8
?kind???????uint8
?equal?func(unsafe.Pointer,?unsafe.Pointer)?bool
?gcdata????*byte
?str???????nameOff
?ptrToThis?typeOff
}
```
* size:類型的大小。
* ptrdata:包含所有指針的內存前綴的大小。
* hash:類型的 hash 值。此處提前計算好,可以避免在哈希表中計算。
* tflag:額外的類型信息標志。此處為類型的 flag 標志,主要用于反射。
* align:對應變量與該類型的內存對齊大小。
* fieldAlign:對應類型的結構體的內存對齊大小。
* kind:類型的枚舉值。包含 Go 語言中的所有類型,例如:`kindBool`、`kindInt`、`kindInt8`、`kindInt16`?等。
* equal:用于比較此對象的回調函數。
* gcdata:存儲垃圾收集器的 GC 類型數據。
總結一句,就是類型信息所需的信息都會存儲在這里面,其中包含字節大小、類型標志、內存對齊、GC 等相關屬性。而在?`eface`?來講,其由于沒有方法集的包袱,因此只需要存儲類型和值信息的指針即可,非常簡單。
### runtime.iface
```
type?iface?struct?{
?tab??*itab
?data?unsafe.Pointer
}
//itab結構體
type?itab?struct?{
?inter?*interfacetype
?_type?*_type
hash??uint32?
?_?????[4]byte
?fun???[1]uintptr?
}
```
* `inter`:接口的類型信息。
* `_type`:具體類型信息
* `hash`:`_type.hash`?的副本,用于目標類型和接口變量的類型對比判斷。
* `fun`:底層數組,存儲接口的方法集的具體實現的地址,其包含一組函數指針,實現了接口方法的動態分派,且每次在接口發生變更時都會更新。
#### interfacetype
```
type?interfacetype?struct?{
?typ?????_type
?pkgpath?name
?mhdr????[]imethod
}
type?nameOff?int32
type?typeOff?int32
type?imethod?struct?{
?name?nameOff
?ityp?typeOff
}
```
* `_type`:接口的具體類型信息。
* `pkgpath`:接口的包(package)名信息。
* `mhdr`:接口所定義的函數列表。
總結:

- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker