Выбор ответа Senior Структуры, методы и интерфейсы обновлено
Что такое itab
Вопрос
Что хранится в непустом интерфейсе (например io.Reader) на уровне рантайма?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Указатель на itab (тип и таблица методов) и указатель на данные. Непустой интерфейс это iface{tab itab, data unsafe.Pointer}. itab вычисляется один раз для пары (интерфейс, конкретный тип) и кешируется; в нём тип и указатели на методы в порядке интерфейса, поэтому вызов это косвенный переход без поиска.
Варианты ответа
- Только указатель на данные, тип хранится в объекте, как vtable в C++
- Копия значения и имя его типа строкой для поиска методов
- Список методов типа, найденный рефлексией при каждом вызове
- Указатель на itab (тип и таблица методов) и указатель на данныеправильный ответ
Разбор
Непустой интерфейс это iface{tab *itab, data unsafe.Pointer}. itab вычисляется один раз для пары (интерфейс, конкретный тип) и кешируется; в нём тип и указатели на методы в порядке интерфейса, поэтому вызов это косвенный переход без поиска. Пустой интерфейс any это eface{_type, data}, без таблицы методов. В объектах Go нет скрытого vtable-указателя, это отличие от C++. Рефлексия при вызове метода не используется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: method value и defer копируют ресивер
- Что выведет Go: nil-указатель в интерфейсе error