Hodnota bool
typ má 2 možné hodnoty:false
a true
. A chcete "komunikovat" 3 různé stavy pomocí bool
pole, jmenovitě neaktualizovat pole, nastavit pole na false
a nastavte pole na true
. To zjevně není možné.
Totéž platí pro int
hodnoty:hodnota 0
nemůže představovat 2 různé možnosti, jmenovitě pole neaktualizovat a nastavit ho na 0
.
Pokud chcete zachovat omitempty
možnosti v hodnotách značek, pak aby to fungovalo, musíte změnit pole na ukazatele:
type Coupon struct {
Id *int `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Code string `json:"code,omitempty" bson:"code,omitempty"`
Description string `json:"description,omitempty" bson:"description,omitempty"`
Status *bool `json:"status" bson:"status"`
MaxUsageLimit *int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
SingleUsePerUser *bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}
Funguje to tak, že pokud je ukazatel nil
, bude vynechán (toto je "omitempty" volba). Pokud je pole jiné než nil
ukazatel, bude aktualizován na ukazovanou hodnotu.
Pokud tedy například chcete vyloučit bool
a poté *bool
hodnota by měla / bude nil
. Pokud jej chcete nastavit / aktualizovat na false
, musí to být ukazatel na false
hodnota. Pokud jej chcete nastavit / aktualizovat na true
, musí to být ukazatel na true
hodnotu.
Obecně platí, že jakýkoli typ, jehož nulová hodnota
je možné a mělo by se s ním počítat, můžete zpracovat pouze "je to nulová hodnota" a "chybí na vstupu", pokud z něj uděláte ukazatel a nil
hodnota ukazatele bude označovat případ "chybějící ze vstupu", zatímco hodnota není nil
ukazatel na nulovou hodnotu bude označovat případ "je to nulová hodnota". Takže ve výše uvedeném příkladu, pokud string
pole mohou také obsahovat hodnotu prázdného řetězce (""
), pak z nich musíte také udělat ukazatele.
Všimněte si, že toho můžete dosáhnout také pomocí vlastní logiky zařazování a vyřazování, ale to je těžkopádnější a pomocí ukazatelů to získáte automaticky.