Тег omitempty
— это параметр тега, который можно использовать в пакете Go encoding/json
для управления тем, как поля кодируются в JSON. Он добавляется к тегу поля, чтобы указать, что поле должно быть исключено из вывода JSON, если его значение является нулевым значением типа. Нулевое значение зависит от типа поля, но для большинства типов это либо nil
, false
, 0
, либо пустая строка.
Вот пример, демонстрирующий, как работает тег omitempty
:
type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Email string `json:"email,omitempty"` } func main() { p1 := Person{Name: "Alice", Age: 30} p2 := Person{Name: "Bob"} data1, _ := json.Marshal(p1) fmt.Println(string(data1)) // {"name":"Alice","age":30} data2, _ := json.Marshal(p2) fmt.Println(string(data2)) // {"name":"Bob"} }
В этом примере структура Person
имеет три поля: Name
, Age
и Email
. Поля Age
и Email
имеют тег omitempty
, что означает, что они будут исключены из вывода JSON, если их значения являются нулевыми значениями соответствующих типов. Когда мы создаем значение Person
p1
с ненулевыми значениями для всех полей, выходные данные JSON включают все поля. Однако когда мы создаем значение Person
p2
с нулевым значением для поля Age
и пустой строкой для поля Email
, выходные данные JSON опускают эти поля.
Использование указателя на структуру с тегом omitempty
полезно, когда у вас есть структура, содержащая несколько полей, и вы хотите представить ее в формате JSON, но хотите пропустить всю структуру, если какое-либо из ее дочерних полей пусто. Это может помочь упростить вывод JSON и облегчить работу с ним в приложении.
Допустим, у вас есть что-то вроде этого…
type Address struct { Street string `json:"street,omitempty"` City string `json:"city,omitempty"` State string `json:"state,omitempty"` } type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Email string `json:"email,omitempty"` Address Address `json:"address,omitempty"` }
предположим, что у вас есть структура Person
с полем Address
, которое содержит три поля: Street
, City
и State
. Если вы хотите условно исключить поле Address
из вывода JSON, если какое-либо из его дочерних полей пусто, вам нужно использовать указатель на структуру Address
с тегом omitempty
. В противном случае вы сможете условно опустить только отдельные поля структуры Address
, но не всю структуру. Определите тип человека таким образом…
type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Email string `json:"email,omitempty"` Address *Address `json:"address,omitempty"` } func setPersonAddress(p *Person, isAddressEmpty ) { if isAddressEmpty { p.Address = nil } else { p.Address = &Address{ Street: "123 Main St.", City: "Anytown", State: "CA", } } }