Исходный код интерфейса 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
в сумке.
использованная литература:
«Иди в бой»