Ein Wert von bool
type hat 2 mögliche Werte:false
und true
. Und Sie möchten 3 verschiedene Zustände mit einem bool
"kommunizieren". Feld, nämlich um das Feld nicht zu aktualisieren, um das Feld auf false
zu setzen und um das Feld auf true
zu setzen . Dies ist offensichtlich nicht möglich.
Dasselbe gilt für int
Werte:ein Wert von 0
kann nicht 2 verschiedene Möglichkeiten darstellen, nämlich das Feld nicht zu aktualisieren und es auf 0
zu setzen .
Wenn Sie die omitempty
beibehalten möchten Optionen in den Tag-Werten, dann müssen Sie, damit es funktioniert, die Felder in Zeiger ändern:
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"`
}
Es funktioniert folgendermaßen, wenn der Zeiger nil
ist , wird es weggelassen (das ist die "Auslassung" Möglichkeit). Wenn das Feld nicht nil
ist Zeiger, wird er auf den angezeigten Wert aktualisiert.
Also zum Beispiel, wenn Sie einen bool
ausschließen möchten Feld, dann *bool
value sollte / wird nil
sein . Wenn Sie es auf false
setzen/aktualisieren möchten , muss es ein Zeiger auf false
sein Wert. Wenn Sie es auf true
setzen/aktualisieren möchten , muss es ein Zeiger auf true
sein Wert.
Im Allgemeinen jeder Typ, dessen Nullwert
ist möglich ist und damit gerechnet werden sollte, können Sie nur mit "es ist der Nullwert" und "es fehlt in der Eingabe" umgehen, wenn Sie daraus einen Zeiger machen, und den nil
Der Wert des Zeigers zeigt den Fall "Fehlt in der Eingabe" an, während er nicht nil
ist Zeiger auf den Nullwert bezeichnet den Fall "es ist der Nullwert". Also im obigen Beispiel wenn der string
Felder könnten auch den leeren Zeichenfolgenwert (""
) annehmen ), dann musst du sie auch zu Zeigern machen.
Beachten Sie, dass Sie dies auch mit benutzerdefinierter Marshalling- und Unmarshaling-Logik erreichen können, aber das ist umständlicher, und die Verwendung von Zeigern gibt Ihnen dies automatisch.