Как вы упомянули, вы можете использовать указатели.
Пакет json
может обрабатывать неверные значения в указатели для вас.Вы не включили полезную нагрузку json, которую вы пытаетесь демонтировать, или структуру, в которую вы демаршируете, поэтому я составил пример.
// json
{
"foo": true,
"number_of_foos": 14
}
// go struct
type Foo struct {
Present bool `json:"foo"`
Num int `json:"number_of_foos"`
}
Здесь, если ключи foo
или number_of_foos
отсутствует, тогда, как вы правильно заметили, будет использовано нулевое значение (false
/ 0
).В общем, лучший совет - использовать нулевое значение .Создайте структуры так, чтобы нулевые значения false
были полезными, а не болезненными.Это не всегда возможно, поэтому изменение типов полей в структуре Foo
на указатели позволит вам проверить 3 случая, которые вы ищете.
- Present
- Настоящее и ноль
- Отсутствует
Здесь та же структура с указателями:
// go struct
type Foo struct {
Present *bool `json:"foo"`
Num *int `json:"number_of_foos"`
}
Теперь вы можете проверить наличие значения с помощью fooStruct.Present != nil
иесли это условие выполняется, вы можете предположить, что значение в поле является тем, которое вы хотели.
Нет необходимости использовать пакет отражения.