Wartość bool
type ma 2 możliwe wartości:false
i true
. I chcesz "komunikować" 3 różne stany za pomocą bool
pole, a mianowicie, aby nie aktualizować pola, aby ustawić pole na false
i ustawić pole na true
. To oczywiście nie jest możliwe.
To samo dotyczy int
wartości:wartość 0
nie może reprezentować 2 różnych opcji, a mianowicie nie aktualizować pola i ustawić je na 0
.
Jeśli chcesz zachować omitempty
opcje w wartościach tagów, a następnie, aby to zadziałało, musisz zmienić pola na wskaźniki:
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"`
}
Działa to tak, że jeśli wskaźnikiem jest nil
, zostanie pominięty (jest to "pominięcie" opcja). Jeśli pole ma wartość inną niż nil
wskaźnik, zostanie zaktualizowany do wskazanej wartości.
Na przykład, jeśli chcesz wykluczyć bool
pole, a następnie *bool
wartość powinna / będzie wynosić nil
. Jeśli chcesz ustawić / zaktualizować go na false
, musi to być wskaźnik do false
wartość. Jeśli chcesz ustawić / zaktualizować go do true
, musi to być wskaźnik do true
wartość.
Ogólnie każdy typ, którego wartość zerowa
jest możliwe i powinno być liczone z, możesz obsłużyć tylko "jest to wartość zero" i "brakuje jej na wejściu", jeśli ustawisz go jako wskaźnik, a nil
wartość wskaźnika będzie oznaczać przypadek "braku w danych wejściowych", podczas gdy inny niż nil
wskaźnik do wartości zerowej będzie oznaczał przypadek „jest to wartość zerowa”. Tak więc w powyższym przykładzie, jeśli string
pola mogą również przyjmować pustą wartość ciągu (""
), musisz także uczynić je wskaźnikami.
Pamiętaj, że możesz to również osiągnąć za pomocą niestandardowej logiki kierowania i rozmieszczania, ale jest to bardziej kłopotliwe, a użycie wskaźników daje to automatycznie.