Графический интерфейс языка Go, лежащий в основе реализации

задняя часть Go

Исходный код интерфейса 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в сумке.

использованная литература:

«Иди в бой»

research.swtch.com/interfaces

nuggets.capable/post/684490…

Для получения более интересного контента, пожалуйста, обратите внимание на мой публичный аккаунт WeChat.互联网技术窝Или добавьте WeChat для обсуждения и общения: