Исходный код интерфейса Go находится в исходном коде Golang.runtimeв каталоге.
Структура интерфейса Go может различаться в разных версиях, но общая структура не изменится.В этой статье используется версия Go — 1.11.
Интерфейс Go реализован двумя типами:ifaceиeface.
в,ifaceПредставляет интерфейс, содержащий методы, например:
type Person interface {
Print()
}
иefaceПредставляет собой интерфейс, не содержащий методов, т.е.
type Person interface {}
или
var person interface{} = xxxx实体
eface
efaceКонкретная структура:
_type, один - информация о данных.
в,_typeЕго можно рассматривать как общее описание всех типов в языке Go, почти все структуры данных в языке Go можно абстрагировать в_type, является производительностью всех типов, можно сказать, что это универсальный тип,dataявляется указателем на определенные данные.
typeКонкретный код:
type _type struct {
size uintptr
ptrdata uintptr // size of memory prefix holding all pointers
hash uint32
tflag tflag
align uint8
fieldalign uint8
kind uint8
alg *typeAlg
// gcdata stores the GC type data for the garbage collector.
// If the KindGCProg bit is set in kind, gcdata is a GC program.
// Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
gcdata *byte
str nameOff
ptrToThis typeOff
}
efaceОбщая структура такова:
Какова внутренняя структура интерфейса без метода после присваивания? Вы можете сначала посмотреть на код:
import (
"fmt"
"strconv"
)
type Binary uint64
func main() {
b := Binary(200)
any := (interface{})(b)
fmt.Println(any)
}
Выход 200, структурная схема после назначения выглядит следующим образом:
typeМетод универсальной структуры run-timeconvT2Eметод, вruntimeв сумке.
Выше приведено описание интерфейса без методов.
Для функций, содержащих методы, используется другая структура, называемаяiface
iface
Все интерфейсы, содержащие методы, будут использоватьifaceструктура. Интерфейс, содержащий метод, является одним из наиболее распространенных и распространенных типов интерфейсов:
type Person interface {
Print()
}
ifaceИсходный код:
type iface struct {
tab *itab
data unsafe.Pointer
}
ifaceКонкретная структура:
itabдаifaceотличается отefaceСравните ключевые структуры данных. Он может состоять из двух частей: одна часть предназначена для определения конкретного типа структуры уникального интерфейса, содержащего метод, а другая часть представляет собой указатель на конкретный набор методов.
Конкретная структура:
itabИсходный код:
type itab struct {
inter *interfacetype //此属性用于定位到具体interface
_type *_type //此属性用于定位到具体interface
hash uint32 // copy of _type.hash. Used for type switches.
_ [4]byte
fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
}
Атрибутыinterfacetypeпохожий на_type, его роль — общедоступное описание интерфейса и т.п.maptype,arraytype,chantype...Это общедоступное описание каждой структуры, которое можно понимать как внешнюю информацию о производительности.interfacetypeИсходный код выглядит следующим образом:
type interfacetype struct {
typ _type
pkgpath name
mhdr []imethod
}
type imethod struct {
name nameOff
ityp typeOff
}
ifaceОбщая структура такова:
Какова внутренняя структура интерфейса, содержащего метод после присваивания? После запуска кода
package main
import (
"fmt"
"strconv"
)
type Binary uint64
func (i Binary) String() string {
return strconv.FormatUint(i.Get(), 10)
}
func (i Binary) Get() uint64 {
return uint64(i)
}
func main() {
b := Binary(200)
any := fmt.Stringer(b)
fmt.Println(any)
}
Во-первых, знайте, что результат выполнения кода: 200.
Во-вторых, понять, чтоfmt.StringerсодержитStringинтерфейс метода.
type Stringer interface {
String() string
}
Наконец, интерфейс после присваиванияStringerВнутренняя структура такова:
Для преобразования разных типов в itabletype(Binary)метод, который является временем выполненияconvT2Iметод, вruntimeв сумке.
использованная литература:
«Иди в бой»