Стойност bool type има 2 възможни стойности:false и true . И искате да "комуникирате" 3 различни състояния с bool поле, а именно да не актуализирате полето, да зададете полето на false и да настроите полето на true . Това очевидно не е възможно.
Същото важи и за int стойности:стойност 0 не може да представлява 2 различни избора, а именно да не се актуализира полето и да се зададе на 0 .
Ако искате да запазите omitempty опции в стойностите на маркера, тогава, за да работи, трябва да промените полетата на указатели:
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"`
}
Начинът, по който работи е, че ако показалецът е nil , то ще бъде пропуснато (това е "omitempty" опция). Ако полето не е nil указател, той ще бъде актуализиран до посочената стойност.
Така например, ако искате да изключите bool полето, след което *bool стойността трябва/ще бъде nil . Ако искате да го зададете/актуализирате на false , трябва да е указател към false стойност. Ако искате да го зададете/актуализирате на true , трябва да е указател към true стойност.
Като цяло всеки тип, чиято нулева стойност
е възможно и трябва да се брои с него, можете да обработвате само „това е нулева стойност“ и „липсва във входа“, ако го направите указател, и nil стойността на указателя ще обозначава случай „липсва от входа“, докато не-nil указателят към нулевата стойност ще обозначи случая "това е нулева стойност". Така че в горния пример, ако string полетата могат също да приемат стойността на празния низ ("" ), тогава трябва да им направите и указатели.
Обърнете внимание, че можете да постигнете това и с помощта на персонализирана логика за маршалинг и демаршалинг, но това е по-тромаво и използването на указатели ви дава това автоматично.