reflect.Type и reflect.Value
TypeOf, ValueOf, Kind и Elem
«reflect.Type и reflect.Value» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Обзор пакета reflect
Пакет reflect позволяет программам Go проверять типы и значения во время выполнения. Он лежит в основе библиотек кодирования, ORM и платформ внедрения зависимостей.
reflect.TypeOf
reflect.TypeOf(x) возвращает reflect.Type значения x:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
reflect.ValueOf(x) возвращает reflect.Value, содержащий x. Прочитать значение можно с помощью методов, соответствующих Kind:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind и Type.Name
Kind — это базовая категория Go (int, struct, ptr, slice, ...). Name — объявленное имя типа ("MyStruct"). Интерфейсы имеют Kind == Interface, но не имеют Name.
Поля структуры
Проверяйте поля структуры с помощью Type.NumField() и Type.Field(i), который возвращает reflect.StructField:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}Чтение значений полей структуры
Используйте Value.FieldByName или Value.Field(i), чтобы читать значения полей во время выполнения:
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"Изменение значений полей структуры
Чтобы установить поле, значение должно быть адресуемым (переданным как указатель):
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")Разыменование указателя
Если значение является указателем, вызовите v.Elem(), чтобы получить значение, на которое он указывает. Сначала проверьте v.Kind() == reflect.Ptr.
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
Создайте новое нулевое значение типа и получите указатель на него:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)Вызов методов
Вызовите метод по имени для отражённого значения:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())Производительность
Отражение в 5–10 раз медленнее прямого кода. Кэшируйте результаты поиска reflect.Type и reflect.Value за пределами горячих циклов. Если производительность критична, используйте генерацию кода.
Быстрая проверка
В чём разница между reflect.Type.Kind() и reflect.Type.Name()?
Итоги: reflect.Type и reflect.Value
Основные положения:
- Используйте reflect.TypeOf и ValueOf для проверки типов во время выполнения
- Kind: базовая категория; Name: объявленное имя
- Value.FieldByName и SetXxx для работы с полями структуры
- Передавайте указатель и вызывайте Elem() для изменяемых значений
Часто задаваемые вопросы
Урок «reflect.Type и reflect.Value» бесплатный?
Да — полный текст урока «reflect.Type и reflect.Value» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «reflect.Type и reflect.Value»?
TypeOf, ValueOf, Kind и Elem Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «reflect.Type и reflect.Value»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- reflect.Type и reflect.Value
- Просмотр полей и тегов структур
- Динамические вызовы функций
- Практическая рефлексия: сериализаторы