Стойност 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
полетата могат също да приемат стойността на празния низ (""
), тогава трябва да им направите и указатели.
Обърнете внимание, че можете да постигнете това и с помощта на персонализирана логика за маршалинг и демаршалинг, но това е по-тромаво и използването на указатели ви дава това автоматично.