Nilai bool type memiliki 2 kemungkinan nilai:false dan true . Dan Anda ingin "berkomunikasi" 3 status berbeda dengan bool bidang, yaitu untuk tidak memperbarui bidang, untuk mengatur bidang ke false dan untuk menyetel bidang ke true . Ini jelas tidak mungkin.
Hal yang sama berlaku untuk int nilai:nilai 0 tidak dapat mewakili 2 pilihan berbeda, yaitu tidak memperbarui bidang dan menyetelnya ke 0 .
Jika Anda ingin menyimpan omitempty opsi dalam nilai tag, lalu untuk membuatnya berfungsi, Anda harus mengubah bidang menjadi pointer:
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"`
}
Cara kerjanya adalah jika pointernya nil , itu akan ditinggalkan (ini adalah "penghilangan" pilihan). Jika bidangnya bukan nil pointer, itu akan diperbarui ke nilai runcing.
Jadi misalnya jika Anda ingin mengecualikan bool kolom, lalu *bool nilai harus / akan menjadi nil . Jika Anda ingin mengatur / memperbaruinya menjadi false , itu harus berupa penunjuk ke false nilai. Jika Anda ingin mengatur / memperbaruinya ke true , itu harus berupa penunjuk ke true nilai.
Secara umum, semua jenis yang nilai nol
dimungkinkan dan harus dihitung dengan, Anda hanya dapat menangani "itu adalah nilai nol" dan "itu hilang dari input" jika Anda menjadikannya sebagai pointer, dan nil nilai pointer akan menunjukkan kasus "hilang dari input", sedangkan non-nil pointer ke nilai nol akan menunjukkan kasus "itu adalah nilai nol". Jadi pada contoh di atas jika string bidang juga bisa mengambil nilai string kosong ("" ), maka Anda juga harus menjadikannya pointer.
Perhatikan bahwa Anda juga dapat mencapai ini menggunakan logika marshaling dan unmarshaling khusus, tetapi itu lebih rumit, dan menggunakan pointer memberi Anda ini secara otomatis.