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.