0Pricing
Go Academy · Урок

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())     // 42

Type.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 — локальная установка не требуется.

Все уроки этого курса

  1. reflect.Type и reflect.Value
  2. Просмотр полей и тегов структур
  3. Динамические вызовы функций
  4. Практическая рефлексия: сериализаторы
← Назад к Go Academy