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.