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.