En værdi på bool
type har 2 mulige værdier:false
og true
. Og du vil "kommunikere" 3 forskellige tilstande med en bool
felt, nemlig ikke at opdatere feltet, at sætte feltet til false
og for at indstille feltet til true
. Dette er åbenbart ikke muligt.
Det samme gælder for int
værdier:en værdi på 0
kan ikke repræsentere 2 forskellige valg, nemlig ikke at opdatere feltet og sætte det til 0
.
Hvis du vil beholde omitempty
muligheder i tag-værdierne, så skal du ændre felterne til pointers for at få det til at fungere:
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"`
}
Måden det fungerer på er, at hvis markøren er nil
, vil det blive udeladt (dette er "undladelse" mulighed). Hvis feltet ikke er nil
markør, vil den blive opdateret til den spidse værdi.
Så for eksempel hvis du vil udelukke en bool
feltet og derefter *bool
værdi skal/vil være nil
. Hvis du vil indstille/opdatere den til false
, skal det være en pointer til en false
værdi. Hvis du vil indstille/opdatere den til true
, skal det være en pegepind til en true
værdi.
Generelt enhver type, hvis nul værdi
er muligt og bør tælles med, kan du kun håndtere "det er nulværdien" og "det mangler i inputtet", hvis du gør det til en pointer, og nil
værdien af markøren vil angive tilfældet "mangler fra input", mens en ikke-nil
markøren til nulværdien vil angive tilfældet "det er nulværdien". Så i ovenstående eksempel hvis string
felter kunne også tage den tomme strengværdi (""
), så skal du også lave dem til pointere.
Bemærk, at du også kan opnå dette ved at bruge tilpasset rangering og unmarshaling-logik, men det er mere besværligt, og brug af pointere giver dig dette automatisk.