Уроки модуля (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:"..."— го-площадка/валидаторform:"..."— привязка джин/эхо
Библиотеки читают их посредством отражения (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, …