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 フィールドは空の文字列値("")を取ることもできます )、次にそれらをポインタにする必要があります。
カスタムマーシャリングおよびアンマーシャリングロジックを使用してこれを実現することもできますが、それはより面倒であり、ポインターを使用すると自動的にこれが得られることに注意してください。