Проверяет понимание внутреннего устройства интерфейсов в Go: структуры itab и указателя на данные.
В Go интерфейс — это не просто абстракция, а конкретная структура данных, которая хранится в памяти. Под капотом каждый интерфейс состоит из двух полей: itab (interface table) и указателя на данные (data). Это позволяет Go эффективно реализовывать полиморфизм и динамическую диспетчеризацию методов.
inter)_type)fun)package main
import "fmt"
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "Woof!"
}
func main() {
var s Speaker = Dog{}
// Под капотом: s.itab = &itab{inter: Speaker, _type: Dog, fun: [Dog.Speak]}
// s.data = &Dog{}
fmt.Println(s.Speak())
}Такая структура позволяет Go проверять соответствие типа интерфейсу на этапе компиляции, а вызов методов — через таблицу itab во время выполнения. Это даёт производительность, близкую к статической диспетчеризации, но с гибкостью полиморфизма.
Понимание itab и указателя на данные помогает писать эффективный код на Go, избегать лишних аллокаций и правильно использовать интерфейсы для абстракции без потери производительности.