Värdet bool
typen har 2 möjliga värden:false
och true
. Och du vill "kommunicera" 3 olika tillstånd med en bool
fältet, nämligen att inte uppdatera fältet, att ställa in fältet till false
och för att ställa in fältet till true
. Detta är uppenbarligen inte möjligt.
Samma sak gäller för int
värden:ett värde på 0
kan inte representera 2 olika val, nämligen att inte uppdatera fältet och att ställa in det på 0
.
Om du vill behålla omitempty
alternativ i taggvärdena, för att få det att fungera måste du ändra fälten till pekare:
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"`
}
Sättet det fungerar är att om pekaren är nil
, kommer den att utelämnas (detta är "oaktsamhet" alternativ). Om fältet är ett icke-nil
pekaren kommer den att uppdateras till det spetsiga värdet.
Så till exempel om du vill utesluta en bool
och sedan *bool
värdet bör / kommer att vara nil
. Om du vill ställa in / uppdatera den till false
, måste det vara en pekare till en false
värde. Om du vill ställa in / uppdatera den till true
, måste det vara en pekare till en true
värde.
I allmänhet alla typer vars nollvärde
är möjligt och bör räknas med, kan du bara hantera "det är nollvärdet" och "det saknas i ingången" om du gör det till en pekare, och nil
värdet på pekaren kommer att beteckna fallet "saknas från ingången", medan ett icke-nil
pekaren till nollvärdet kommer att beteckna fallet "det är nollvärdet". Så i exemplet ovan om string
fält kan också ta det tomma strängvärdet (""
), då måste du också göra dem pekare.
Observera att du också kan uppnå detta genom att använda anpassad logik för rangordning och uppdelning, men det är mer besvärligt, och att använda pekare ger dig detta automatiskt.