Middle+
178
questionbank

Каково внутреннее устройство интерфейсов в Go?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Интерфейс в Go — это пара: указатель на данные и указатель на таблицу методов.

go
  • data: Хранит указатель на фактическое значение, которое реализует интерфейс. Если значение по типу является указателем, то data указывает на сам указатель. Если значение по типу не является указателем (например, int, string), оно может быть скопировано или храниться в отдельной структуре, на которую и указывает data. Маленькие значения могут храниться непосредственно в data.
  • itab: Указатель на таблицу методов для конкретной пары интерфейс/тип. Эта таблица создается при первом преобразовании конкретного типа к этому интерфейсу или при компиляции для известных пар тип/интерфейс.

Когда вызывается метод интерфейса, Go использует itab, чтобы найти правильную функцию (метод) для вызванного типа и вызывает ее, передавая data как получателя.

Ключевые моменты:

  • Go не требует явного объявления о реализации интерфейса. Проверка происходит в рантайме или статически в момент компиляции.
  • itab кэшируется, что ускоряет последующие вызовы методов того же интерфейса для того же типа.
  • Интерфейсы в Go "тонкие" (non-fat pointers) по сравнению с их аналогами в некоторых других языках, что способствует производительности.
  • Пустой интерфейс (interface{}) имеет itab, равный nil, поскольку у него нет методов, только указатель на данные (data).