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