Un valore di bool
type ha 2 possibili valori:false
e true
. E vuoi "comunicare" 3 stati diversi con un bool
field, ovvero non aggiornare il campo, impostare il campo su false
e per impostare il campo su true
. Questo ovviamente non è possibile.
Stessa cosa vale per int
valori:un valore di 0
non può rappresentare 2 scelte diverse, ovvero non aggiornare il campo e impostarlo a 0
.
Se vuoi mantenere l'omitempty
opzioni nei valori dei tag, quindi per farlo funzionare, devi cambiare i campi in puntatori:
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"`
}
Il modo in cui funziona è che se il puntatore è nil
, verrà omesso (questo è il "omitempty" opzione). Se il campo non è nil
puntatore, verrà aggiornato al valore indicato.
Quindi, ad esempio, se vuoi escludere un bool
campo, quindi il *bool
il valore dovrebbe / sarà nil
. Se vuoi impostarlo / aggiornarlo su false
, deve essere un puntatore a un false
valore. Se vuoi impostarlo / aggiornarlo su true
, deve essere un puntatore a un true
valore.
In generale, qualsiasi tipo il cui valore zero
è possibile e dovrebbe essere contato, puoi gestire solo "è il valore zero" e "manca dall'input" se lo rendi un puntatore e nil
il valore del puntatore indicherà il caso "mancante dall'input", mentre un non nil
il puntatore al valore zero indicherà il caso "è il valore zero". Quindi nell'esempio sopra se la string
i campi possono anche assumere il valore di una stringa vuota (""
), quindi devi renderli anche dei puntatori.
Tieni presente che puoi raggiungere questo obiettivo anche utilizzando la logica di marshalling e unmarshalling personalizzata, ma è più complicato e l'utilizzo dei puntatori lo fornisce automaticamente.