Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, interface, itab, data pointer, runtime

Из каких двух компонентов состоит интерфейс в Go под капотом (itab + указатель на данные)?

Проверяет понимание внутреннего устройства интерфейсов в Go: структуры itab и указателя на данные.

Короткий ответ

Интерфейс в Go под капотом состоит из двух компонентов: itab (interface table) и указателя на данные. itab хранит метаданные о типе и список методов, а указатель ссылается на конкретное значение. Это позволяет Go реализовать динамическую диспетчеризацию методов.

Длинный ответ

Внутреннее устройство интерфейсов в Go

В Go интерфейс — это не просто абстракция, а конкретная структура данных, которая хранится в памяти. Под капотом каждый интерфейс состоит из двух полей: itab (interface table) и указателя на данные (data). Это позволяет Go эффективно реализовывать полиморфизм и динамическую диспетчеризацию методов.

Компоненты интерфейса

  • itab — структура, содержащая метаданные о типе, реализующем интерфейс, и таблицу методов. Она включает:
    • Тип самого интерфейса (inter)
    • Тип конкретного значения (_type)
    • Список функций, соответствующих методам интерфейса (fun)
  • data — указатель на фактические данные (значение), которое хранится в интерфейсе. Если значение меньше или равно размеру указателя, оно может храниться непосредственно в этом поле.

Пример работы

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, избегать лишних аллокаций и правильно использовать интерфейсы для абстракции без потери производительности.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#interface

#itab

#data pointer

#runtime

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.