6 вопросов
Пакет reflect: TypeOf vs ValueOf, CanSet и адресуемость, чтение struct tags, проверка реализации интерфейсов. Производительность reflect vs generics и когда рефлексия оправдана.
TypeOf возвращает reflect.Type (информация о типе). ValueOf возвращает reflect.Value (конкретное значение в рантайме).
Подробнее →В Go аргументы передаются по значению. ValueOf получает копию; изменение копии через Set не должно влиять на оригинал. Чтобы менять оригинал, нужно передать указатель (адрес), тогда рефлексия снимает один уровень указателя и даёт адресуемое значение.
Подробнее →У reflect.StructField есть поле Tag (тип reflect.StructTag). Методы tag.Get("json") и tag.Lookup("json") возвращают значение тега с заданным ключом (например json). Lookup позволяет отличить отсутствие тега от пустого значения.
Подробнее →Рефлексия требует проверок типов и аллокаций в рантайме. Дженерики генерируют специализированный код при компиляции.
Подробнее →Рефлексия уместна, когда тип неизвестен до рантайма (сериализаторы, плагины). Иначе - интерфейсы, дженерики или кодогенерация.
Подробнее →Тип интерфейса получают как reflect.TypeOf((*Interface)(nil)).Elem(), затем проверяют implType.Implements(ifaceType).
Подробнее →