bool
の値 タイプには2つの可能な値があります:false
およびtrue
。そして、bool
を使用して3つの異なる状態を「通信」したいとします。 フィールド、つまりフィールドを更新しない、フィールドをfalse
に設定する フィールドをtrue
に設定します 。これは明らかに不可能です。
int
についても同じことが言えます 値:0
の値 フィールドを更新しないことと、フィールドを0
に設定することの、2つの異なる選択肢を表すことはできません。 。
omitempty
を維持したい場合 タグ値のオプション、それを機能させるには、フィールドをポインタに変更する必要があります:
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"`
}
それが機能する方法は、ポインタがnil
の場合です。 、省略されます(これは "omitempty" オプション)。フィールドがnil
以外の場合 ポインタを指定すると、指定された値に更新されます。
たとえば、bool
を除外する場合 フィールド、次に*bool
値はnil
である必要があります 。 false
に設定/更新する場合 、false
へのポインタである必要があります 価値。 true
に設定/更新する場合 、true
へのポインタである必要があります 価値。
一般に、ゼロ値
のタイプ 可能であり、カウントする必要があります。ポインタにすると、「ゼロ値になっている」と「入力から欠落している」、およびnil
のみを処理できます。 ポインタの値は「入力から欠落している」場合を示し、nil
以外の場合 ゼロ値へのポインタは、「ゼロ値である」場合を示します。したがって、上記の例では、string
フィールドは空の文字列値(""
)を取ることもできます )、次にそれらをポインタにする必要があります。
カスタムマーシャリングおよびアンマーシャリングロジックを使用してこれを実現することもできますが、それはより面倒であり、ポインターを使用すると自動的にこれが得られることに注意してください。