Разбор пользовательских тегов
Читайте теги через рефлексию
«Разбор пользовательских тегов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Что такое теги структур
- Теги JSON
- Библиотеки валидации
- Разбор пользовательских тегов