Um valor de
bool type tem 2 valores possíveis:false e true . E você quer "comunicar" 3 estados diferentes com um bool campo, ou seja, para não atualizar o campo, para definir o campo para false e para definir o campo como true . Isso obviamente não é possível. A mesma coisa vale para
int valores:um valor de 0 não pode representar 2 escolhas diferentes, ou seja, não atualizar o campo e defini-lo como 0 . Se você quiser manter o
omitempty opções nos valores da tag, então para que funcione, você deve alterar os campos para ponteiros: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"`
}
A maneira como funciona é que, se o ponteiro for
nil , ele será deixado de fora (este é o "omitempty" opção). Se o campo não for nil ponteiro, ele será atualizado para o valor apontado. Por exemplo, se você deseja excluir um
bool campo, então o *bool o valor deve/será nil . Se você deseja definir/atualizá-lo para false , deve ser um ponteiro para um false valor. Se você deseja definir/atualizá-lo para true , deve ser um ponteiro para um true valor. Em geral, qualquer tipo cujo valor zero é possível e deve ser contado, você só pode lidar com o "está sendo o valor zero" e "está faltando na entrada" se você fizer um ponteiro, e o
nil valor do ponteiro denotará o caso "ausente da entrada", enquanto um não-nil ponteiro para o valor zero denotará o caso "está sendo o valor zero". Portanto, no exemplo acima, se a string campos também podem receber o valor de string vazio ("" ), então você também deve torná-los ponteiros. Observe que você também pode conseguir isso usando a lógica de empacotamento e desempacotamento personalizados, mas isso é mais complicado e o uso de ponteiros fornece isso automaticamente.