Перейти до основного вмісту
Модуль 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:"..." — go-playground/validator
  • form:"..." — прив'язка gin / echo

Бібліотеки читають їх через рефлексію (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, …