Модульні уроки (4/5)
Теги полів і JSON
Теги в полях структури – це рядки метаданих, які зчитуються за допомогою відображення
такими бібліотеками, як encoding/json, encoding/xml, валідатори, ORM. Вони
записуються між зворотними галочками (необроблений рядок) одразу після типу поля.
Синтаксис
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Правила форматування: key:"value" розділені пробілами (НЕ
коми) для кількох ключів:
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 |
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 є
виключено повністю.
Маршал і Немаршал
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal приймає лише вказівник, оскільки він має писати в
поля значень.
Інші поширені теги
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— go-playground/validatorform:"..."— прив'язка gin / echo
Бібліотеки читають їх через рефлексію (reflect.StructTag.Get("json")):
вони просто рядки, поки хтось їх не інтерпретує.
Спробуйте
Додайте тег json:"nome" у поле "Ім'я" та тег json:"eta" у поле "Вік".
Показати підказку
Теги — це необроблені рядки між зворотними галочками відразу після типу поля.
Рішення доступне після 3 спроб
Додайте опцію omitempty до поля «Вік»: її потрібно опустити, якщо вона дорівнює 0.
Показати підказку
Параметри йдуть після назви, розділені комою: json:"nome,omitempty".
Рішення доступне після 3 спроб
Що він друкує з тегами json:"nome" і json:"eta"?
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, …