0Pricing
Go Academy · Урок

Просмотр полей и тегов структур

Перебор полей и чтение тегов структур

«Просмотр полей и тегов структур» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Тип StructField

reflect.StructField описывает одно поле структуры: Name, Type, Tag, Index, Offset, Anonymous и IsExported.

Перебор полей

Переберите все поля типа структуры:

t := reflect.TypeOf(struct{ ID int; Name string }{})
for i := 0; i < t.NumField(); i++ {
    f := t.Field(i)
    fmt.Println(f.Name, f.Type, f.IsExported())
}

Чтение тегов структуры

Доступ к тегам осуществляется через StructField.Tag.Get("key"):

type User struct {
    ID   int    `json:"id" db:"user_id"`
    Name string `json:"name,omitempty"`
}

f, _ := reflect.TypeOf(User{}).FieldByName("Name")
fmt.Println(f.Tag.Get("json")) // "name,omitempty"

Разбор параметров тегов

Теги могут содержать параметры, разделённые запятыми. Разберите их с помощью strings.Split:

tag := f.Tag.Get("json") // "name,omitempty"
parts := strings.Split(tag, ",")
name := parts[0] // "name"
omitempty := len(parts) > 1 && parts[1] == "omitempty"

FieldByName и FieldByIndex

Найдите поле по имени или индексу. FieldByName ищет экспортированные поля в структуре и встроенных структурах:

f, ok := reflect.TypeOf(User{}).FieldByName("Name")
if ok { fmt.Println(f.Tag.Get("json")) }

Поля встроенной структуры

Для встроенных структур значение Anonymous равно true. Используйте Type.FieldByIndex([]int{0,1}), чтобы получить доступ к вложенным полям.

Неэкспортируемые поля

Неэкспортируемые (с именами в нижнем регистре) поля можно проверять на предмет их типа и тега, но их значения нельзя читать или устанавливать с помощью отражения — это приводит к панике.

Создание кэша полей

Разбирать теги структуры при каждом вызове затратно. Кэшируйте результат в sync.Map с ключом reflect.Type:

var fieldCache sync.Map
func getFields(t reflect.Type) []fieldInfo {
    if v, ok := fieldCache.Load(t); ok { return v.([]fieldInfo) }
    fields := parseFields(t)
    fieldCache.Store(t, fields)
    return fields
}

Пример использования: простая ORM

Пройдите по всем полям с тегом "db", чтобы динамически создать список столбцов INSERT:

t := reflect.TypeOf(u)
v := reflect.ValueOf(u)
for i := 0; i < t.NumField(); i++ {
    col := t.Field(i).Tag.Get("db")
    val := v.Field(i).Interface()
    // build query...
}

Пример использования: загрузчик конфигурации

Пройдите по полям структуры с тегом "env" и заполните их из переменных окружения:

if env := f.Tag.Get("env"); env != "" {
    if val := os.Getenv(env); val != "" {
        v.Field(i).SetString(val)
    }
}

StructTag.Lookup

Tag.Lookup("key") возвращает значение тега и логическое значение, указывающее, присутствовал ли ключ вообще (в отличие от Get, который возвращает "" для отсутствующих ключей).

val, ok := f.Tag.Lookup("json")
if !ok { /* no json tag */ }

Быстрая проверка

Как прочитать значение тега структуры "json" из reflect.StructField?

Итоги: поля и теги структуры

Основные положения:

  • reflect.TypeOf → .NumField(), .Field(i) для получения метаданных поля
  • StructField.Tag.Get("key") для чтения значений тегов
  • Кэшируйте метаданные полей в sync.Map, чтобы избежать повторного разбора
  • Используйте Tag.Lookup, когда важно отличать отсутствующий тег от пустой строки

Часто задаваемые вопросы

Урок «Просмотр полей и тегов структур» бесплатный?

Да — полный текст урока «Просмотр полей и тегов структур» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Просмотр полей и тегов структур»?

Перебор полей и чтение тегов структур Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Просмотр полей и тегов структур»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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