Un valor de bool
type tiene 2 valores posibles:false
y true
. Y desea "comunicar" 3 estados diferentes con un bool
campo, es decir, no actualizar el campo, establecer el campo en false
y para establecer el campo en true
. Esto obviamente no es posible.
Lo mismo ocurre con int
valores:un valor de 0
no puede representar 2 opciones diferentes, a saber, no actualizar el campo y establecerlo en 0
.
Si desea mantener el omitempty
opciones en los valores de la etiqueta, luego, para que funcione, debe cambiar los campos a punteros:
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 forma en que funciona es que si el puntero es nil
, se omitirá (este es el "omiempty" opción). Si el campo no es nil
puntero, se actualizará al valor señalado.
Entonces, por ejemplo, si desea excluir un bool
campo, luego el *bool
el valor debería/será nil
. Si desea configurarlo/actualizarlo a false
, debe ser un puntero a un false
valor. Si desea configurarlo/actualizarlo a true
, debe ser un puntero a un true
valor.
En general, cualquier tipo cuyo valor cero
es posible y debe contarse con él, solo puede manejar el "está siendo el valor cero" y "falta en la entrada" si lo convierte en un puntero, y el nil
el valor del puntero denotará el caso "ausente de la entrada", mientras que un valor no nil
puntero al valor cero denotará el caso "está siendo el valor cero". Entonces, en el ejemplo anterior, si la string
los campos también podrían tomar el valor de la cadena vacía (""
), entonces también tienes que convertirlos en punteros.
Tenga en cuenta que también puede lograr esto utilizando la lógica personalizada de clasificación y desclasificación, pero eso es más engorroso, y el uso de punteros lo proporciona automáticamente.