Go Academy · Урок

Разбор пользовательских тегов

Читайте теги через рефлексию

Урок 4 из 413 шагов

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

Самостоятельное чтение тегов

Можно определить собственные ключи тегов и считывать их во время выполнения с помощью пакета reflect. Это позволяет создавать настраиваемое поведение на основе метаданных.

reflect.TypeOf

reflect.TypeOf возвращает тип, описывающий значение. С помощью типа структуры можно изучить её поля.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
}

func main() {
	t := reflect.TypeOf(User{})
	fmt.Println(t.Kind(), t.NumField())
}

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

NumField и Field(i) позволяют пройти в цикле по каждому полю типа структуры.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
	Age  int
}

func main() {
	t := reflect.TypeOf(User{})
	for i := 0; i < t.NumField(); i++ {
		fmt.Println(t.Field(i).Name)
	}
}

Доступ к тегу поля

У каждого поля есть Tag типа reflect.StructTag. Вызовите .Get(key), чтобы прочитать значение определённого тега.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Full Name\""
}

func main() {
	f := reflect.TypeOf(User{}).Field(0)
	fmt.Println(f.Tag.Get("label"))
}

Определение собственного тега

Можно придумать любой ключ тега. Здесь пользовательский тег label задаёт понятное человеку имя каждого поля.

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email Address\""
	City  string "label:\"City\""
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		fmt.Println(f.Name, "->", f.Tag.Get("label"))
	}
}

Tag.Lookup для необязательных тегов

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

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
	Token string
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		v, ok := t.Field(i).Tag.Lookup("label")
		fmt.Println(t.Field(i).Name, v, ok)
	}
}

Чтение значений полей

Объедините reflect.ValueOf с типом, чтобы прочитать и тег, и текущее значение каждого поля.

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
}

func main() {
	f := Form{Email: "a@b.com"}
	t := reflect.TypeOf(f)
	v := reflect.ValueOf(f)
	fmt.Println(t.Field(0).Tag.Get("label"), "=", v.Field(0))
}

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

Если значение тега содержит несколько параметров (например, name,opt), разделите его самостоятельно с помощью strings.Split по запятой.

package main

import (
	"fmt"
	"strings"
)

func main() {
	tag := "name,omitempty"
	parts := strings.Split(tag, ",")
	fmt.Println("name:", parts[0], "opts:", parts[1:])
}

Небольшой пример использования

Объединим всё вместе: построим простое отображение меток из структуры, которое уровень пользовательского интерфейса сможет использовать для отображения подписей полей формы.

package main

import (
	"fmt"
	"reflect"
)

type Profile struct {
	Name string "label:\"Your Name\""
	Bio  string "label:\"About You\""
}

func main() {
	t := reflect.TypeOf(Profile{})
	labels := map[string]string{}
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		labels[f.Name] = f.Tag.Get("label")
	}
	fmt.Println(labels)
}

Затраты на отражение

Отражение обладает большими возможностями, но работает медленнее прямого кода и обходит проверки во время компиляции. Используйте его для функций, подобных возможностям библиотек, а не в часто выполняемых циклах.

Указатели и отражение

Если у вас есть указатель, вызовите reflect.TypeOf(v).Elem(), чтобы получить тип исходной структуры перед изучением её полей.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Name\""
}

func main() {
	u := &User{}
	t := reflect.TypeOf(u).Elem()
	fmt.Println(t.Field(0).Tag.Get("label"))
}

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

Какой метод считывает значение пользовательского ключа тега из поля структуры, полученного с помощью отражения?

Итоги

Разбор пользовательских тегов:

  • Используйте reflect.TypeOf и перебирайте поля
  • field.Tag.Get / Lookup считывают значения тегов
  • Разделяйте значения, чтобы разобрать параметры
  • Отражение обладает большими возможностями, но работает медленнее; используйте его для функций библиотек
Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

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

Курсы
51
Уроки
203

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

Урок «Разбор пользовательских тегов» бесплатный?

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

Чему я научусь в уроке «Разбор пользовательских тегов»?

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

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

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

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

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

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

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

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

  1. Что такое теги структур
  2. Теги JSON
  3. Библиотеки валидации
  4. Разбор пользовательских тегов
← Назад к Go Academy