Une valeur de bool
type a 2 valeurs possibles :false
et true
. Et vous voulez "communiquer" 3 états différents avec un bool
champ, à savoir ne pas mettre à jour le champ, pour définir le champ sur false
et pour définir le champ sur true
. Ce n'est évidemment pas possible.
Même chose pour int
valeurs :une valeur de 0
ne peut pas représenter 2 choix différents, à savoir ne pas mettre à jour le champ et le mettre à 0
.
Si vous souhaitez conserver le omitempty
options dans les valeurs des balises, puis pour que cela fonctionne, vous devez changer les champs en pointeurs :
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"`
}
La façon dont cela fonctionne est que si le pointeur est nil
, il sera omis (c'est le "omitempty" option). Si le champ est non nil
pointeur, il sera mis à jour à la valeur pointée.
Ainsi, par exemple, si vous souhaitez exclure un bool
champ, puis le *bool
la valeur devrait/sera nil
. Si vous souhaitez le définir / le mettre à jour sur false
, il doit s'agir d'un pointeur vers un false
évaluer. Si vous souhaitez le définir / le mettre à jour sur true
, il doit s'agir d'un pointeur vers un true
valeur.
En général, tout type dont la la valeur zéro
est possible et doit être pris en compte, vous ne pouvez gérer que "c'est la valeur zéro" et "il manque à l'entrée" si vous en faites un pointeur, et le nil
la valeur du pointeur indiquera le cas "absent de l'entrée", tandis qu'un non-nil
pointeur vers la valeur zéro indiquera le cas "il s'agit de la valeur zéro". Ainsi, dans l'exemple ci-dessus, si la string
les champs peuvent également prendre la valeur de chaîne vide (""
), alors vous devez également en faire des pointeurs.
Notez que vous pouvez également y parvenir en utilisant une logique de marshaling et de démarshaling personnalisée, mais c'est plus lourd, et l'utilisation de pointeurs vous le donne automatiquement.