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.