Перейти к основному содержимому
Модуль 5 · Урок 4 из 524/50 в курсе~12 min
Уроки модуля (4/5)

Теги полей и JSON

Теги в полях структуры представляют собой строки метаданных, считываемые посредством отражения. такими библиотеками, как encoding/json, encoding/xml, валидаторами, ORM. Они записываются между обратными кавычками (необработанной строкой) сразу после типа поля.

Синтаксис

Go
type User struct {
    Name string `json:"nome"`
    Age  int    `json:"eta,omitempty"`
}

Соглашение о формате: key:"value", разделенные пробелами (НЕ запятые) для нескольких ключей:

Go
type User struct {
    Email string `json:"email" validate:"required,email"`
}

Тег json: параметры

Наиболее распространенный вариант — json, используемый encoding/json:

ТегЭффект
json:"nome"Переименовывает поле в nome в выходных данных JSON
json:"nome,omitempty"Пропускает поле, если оно имеет нулевое значение
json:"-"Не сериализуйте/десериализуйте это поле
json:",omitempty"Сохраняет имя поля Go, но с omitempty
Go
type User struct {
    Name     string `json:"nome"`
    Age      int    `json:"eta,omitempty"`
    Password string `json:"-"`
}

u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b))   // {"nome":"Ada"}

Age опущен (нулевое значение 0 + omitempty); Password — это исключено полностью.

Маршал и унмаршал

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal принимает только указатель, поскольку он должен записывать в поля значений.

Другие распространенные теги

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx/pgx
  • validate:"..." — го-площадка/валидатор
  • form:"..." — привязка джин/эхо

Библиотеки читают их посредством отражения (reflect.StructTag.Get("json")): это всего лишь строки, пока кто-нибудь их не интерпретирует.

Попробуйте это

Упражнение#go.m5.l4.e1
Попыток: 0Загрузка…

Добавьте тег json: «nome» в поле «Имя» и тег json: «eta» в поле «Возраст».

Загрузка редактора…
Показать подсказку

Теги — это необработанные строки между обратными кавычками сразу после типа поля.

Решение доступно после 3 попыток

Упражнение#go.m5.l4.e2
Попыток: 0Загрузка…

Добавьте параметр omitempty в поле «Возраст»: он должен быть опущен, если он равен 0.

Загрузка редактора…
Показать подсказку

Опции идут после имени, разделенные запятой: json:"nome,omitempty".

Решение доступно после 3 попыток

Quiz#go.m5.l4.e3
Готово

Что он печатает с тегами json: «nome» и json: «eta»?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
Варианты ответа

Резюме

  • Теги представляют собой необработанные строки между обратными кавычками: `key:"value" key2:"value2"`.
  • json:"nome": переименовать. omitempty: пропустить, если значение равно нулю. -: исключить.
  • НЕэкспортируемые поля (строчные) игнорируются encoding/json.
  • json.Marshal(v) ↔ json.Unmarshal(data, &v) (указатель).
  • Тот же механизм для xml, yaml, db, validate, form, …