Apabila berurusan dengan borang yang mengandungi medan pilihan, adalah perkara biasa untuk mewakili medan tersebut sebagai rentetan kosong, nilai boolean palsu atau integer bernilai sifar dalam JSON. Walau bagaimanapun, apabila menggunakan bendera omitempty dalam struktur Golang, nilai ini secara eksplisit diabaikan semasa pemetaan, yang boleh membawa kepada isu semasa mengemas kini dokumen dalam MongoDB.
Pertimbangkan struktur Kupon dalam Golang dengan medan ditandakan sebagai kosong:
type Coupon struct { Id int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status bool `json:"status" bson:"status"` }
Semasa simpan awal, semua medan bukan kosong berjaya disimpan dalam MongoDB. Walau bagaimanapun, selepas kemas kini berikutnya, jika mana-mana medan pilihan telah diubah suai kepada nilai kosong (cth., kotak pilihan yang tidak ditandakan), bendera omitempty menghalang nilai kosong daripada dipetakan ke dalam struktur. Akibatnya, operasi kemas kini gagal mengubah suai nilai medan sedia ada.
Isu timbul kerana jenis bool dan int hanya mempunyai dua nilai yang mungkin (salah dan benar, 0 dan bukan sifar, masing-masing). Untuk menampung keperluan untuk mewakili tiga keadaan (bukan kemas kini, ditetapkan kepada palsu atau ditetapkan kepada benar) untuk medan bool dan kes serupa untuk medan int, medan struktur hendaklah diubah suai untuk menggunakan penunjuk.
type Coupon struct { Id *int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status *bool `json:"status" bson:"status"` }
Dengan penunjuk, nilai sifar mewakili medan yang ditinggalkan. Untuk penunjuk bukan nol, nilai yang ditunjuk mewakili nilai medan. Oleh itu, senario berikut boleh dikendalikan:
Dengan menggunakan penunjuk dan bendera omitempty, anda boleh mengendalikan medan pilihan dalam struktur Golang dengan berkesan sambil memastikan kemas kini dilakukan dengan betul tanpa mengatasi nilai sedia ada dalam MongoDB.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Medan Pilihan dengan `omitempty` dalam Go Apabila Mengemas kini Dokumen MongoDB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!