Просмотр полей и тегов структур
Перебор полей и чтение тегов структур
«Просмотр полей и тегов структур» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- reflect.Type и reflect.Value
- Просмотр полей и тегов структур
- Динамические вызовы функций
- Практическая рефлексия: сериализаторы