Рефлексия

6 вопросов

Пакет reflect: TypeOf vs ValueOf, CanSet и адресуемость, чтение struct tags, проверка реализации интерфейсов. Производительность reflect vs generics и когда рефлексия оправдана.

1 В чем разница между reflect.TypeOf и reflect.ValueOf? 🟢 Лёгкий
Ответ: A) TypeOf возвращает описание типа (имя, вид, методы), ValueOf - конкретное значение

TypeOf возвращает reflect.Type (информация о типе). ValueOf возвращает reflect.Value (конкретное значение в рантайме).

Подробнее →
2 Почему reflect.Value.CanSet() возвращает false, если в reflect.ValueOf передали не указатель? 🟡 Средний
Ответ: A) ValueOf копирует значение; рефлексия может менять только то, на что указывает переданный адрес

В Go аргументы передаются по значению. ValueOf получает копию; изменение копии через Set не должно влиять на оригинал. Чтобы менять оригинал, нужно передать указатель (адрес), тогда рефлексия снимает один уровень указателя и даёт адресуемое значение.

Подробнее →
3 Как в Go прочитать теги полей структуры (struct tags) через рефлексию? 🟡 Средний
Ответ: A) reflect.Type.Field(i).Tag и tag.Get("json") или tag.Lookup("json")

У reflect.StructField есть поле Tag (тип reflect.StructTag). Методы tag.Get("json") и tag.Lookup("json") возвращают значение тега с заданным ключом (например json). Lookup позволяет отличить отсутствие тега от пустого значения.

Подробнее →
4 Чем обычно отличается производительность кода на reflect от кода на дженериках? 🟡 Средний
Ответ: A) Рефлексия дает оверхед и аллокации в рантайме; дженерики разрешаются при компиляции

Рефлексия требует проверок типов и аллокаций в рантайме. Дженерики генерируют специализированный код при компиляции.

Подробнее →
5 В каких случаях рефлексия в Go оправдана, а когда лучше обойтись без нее? 🟡 Средний
Ответ: A) Оправдана: универсальная сериализация, плагины; лучше без нее: когда типы известны при компиляции

Рефлексия уместна, когда тип неизвестен до рантайма (сериализаторы, плагины). Иначе - интерфейсы, дженерики или кодогенерация.

Подробнее →
6 Как во время выполнения проверить, что тип реализует интерфейс через reflect? 🔴 Сложный
Ответ: B) Через reflect.TypeOf((*Interface)(nil)).Elem() и метод Implements

Тип интерфейса получают как reflect.TypeOf((*Interface)(nil)).Elem(), затем проверяют implType.Implements(ifaceType).

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.