Een waarde van bool
type heeft 2 mogelijke waarden:false
en true
. En je wilt 3 verschillende toestanden "communiceren" met een bool
veld, namelijk om het veld niet bij te werken, om het veld in te stellen op false
en om het veld in te stellen op true
. Dit is natuurlijk niet mogelijk.
Hetzelfde geldt voor int
waarden:een waarde van 0
kan niet 2 verschillende keuzes vertegenwoordigen, namelijk het veld niet bijwerken en op 0
zetten .
Als u de omitempty
. wilt behouden opties in de tag-waarden, en om het te laten werken, moet u de velden wijzigen in pointers:
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"`
}
De manier waarop het werkt is dat als de aanwijzer nil
. is , zal het worden weggelaten (dit is de "omitempty" keuze). Als het veld een niet-nil
. is aanwijzer, wordt deze bijgewerkt naar de puntwaarde.
Dus als u bijvoorbeeld een bool
. wilt uitsluiten veld, dan de *bool
waarde zou / zal nil
moeten zijn . Als u het wilt instellen / bijwerken naar false
, het moet een verwijzing zijn naar een false
waarde. Als u het wilt instellen / bijwerken naar true
, het moet een verwijzing zijn naar een true
waarde.
In het algemeen elk type waarvan de waarde nul
is mogelijk en moet worden meegeteld, je kunt alleen omgaan met de "het is de nulwaarde" en "het ontbreekt in de invoer" als je er een aanwijzer van maakt, en de nil
waarde van de aanwijzer geeft het geval "ontbrekend in de invoer" aan, terwijl een niet-nil
aanwijzer naar de nulwaarde geeft het geval aan "het is de nulwaarde". Dus in het bovenstaande voorbeeld als de string
velden kunnen ook de lege tekenreekswaarde aannemen (""
), dan moet je ze ook pointers maken.
Merk op dat je dit ook kunt bereiken met behulp van aangepaste marshaling- en unmarshaling-logica, maar dat is omslachtiger, en het gebruik van aanwijzers geeft je dit automatisch.