Dalam artikel ini, kami menangani dilema bekerja dengan nilai SQL NULL dalam Go dan cara mengendalikannya Perwakilan JSON dengan berkesan.
Apabila menggunakan jenis Go seperti int64 dan rentetan, nilai nol tidak boleh disimpan terus. Walau bagaimanapun, kita boleh menggunakan sql.NullInt64 dan sql.NullString untuk tujuan ini. Walau bagaimanapun, apabila jenis ini dibenamkan dalam struct dan ditukar kepada JSON menggunakan pakej json, format yang terhasil menyimpang daripada yang diperoleh apabila menggunakan int64 biasa dan jenis rentetan.
Perbezaan ini timbul kerana perwakilan JSON bagi Jenis sql.Null*** termasuk tahap tambahan kerana jenis ini pada dasarnya adalah struct sendiri. Akibatnya, timbul keperluan untuk penyelesaian untuk mencapai format JSON yang diingini.
Daripada meninggalkan penggunaan nilai NULL dalam pangkalan data SQL, satu penyelesaian yang berdaya maju ialah mencipta jenis tersuai yang melaksanakan json. Antara muka Marshaller dan json.Unmarshaler. Dengan membenamkan jenis sql.NullInt64, kami mengekalkan kaedah SQL sambil mendapat kawalan ke atas pengendalian JSON. Berikut ialah contoh yang menunjukkan pendekatan ini:
type JsonNullInt64 struct { sql.NullInt64 } func (v JsonNullInt64) MarshalJSON() ([]byte, error) { if v.Valid { return json.Marshal(v.Int64) } else { return json.Marshal(nil) } } func (v *JsonNullInt64) UnmarshalJSON(data []byte) error { // Unmarshalling into a pointer will let us detect null var x *int64 if err := json.Unmarshal(data, &x); err != nil { return err } if x != nil { v.Valid = true v.Int64 = *x } else { v.Valid = false } return nil }
Dengan menggunakan jenis tersuai ini menggantikan sql.NullInt64, perwakilan JSON sejajar dengan format yang dikehendaki.
Untuk menunjukkan penyelesaian ini, anda boleh jalankan kod berikut di taman permainan Go:
func main() { type Person struct { Age int64 `json:"age"` AgeJson JsonNullInt64 `json:"ageJson"` } p := Person{ Age: 10, AgeJson: sql.NullInt64{Int64: 0, Valid: true}, } b, _ := json.Marshal(p) fmt.Println(string(b)) }
Output akan menyerupai berikut:
{"age":10,"ageJson":10}
Pendekatan ini membolehkan pengendalian nilai NULL yang lancar dalam kedua-dua SQL dan JSON, mengekalkan ketekalan dalam perwakilan data.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Nilai SQL NULL dan Perwakilan JSON mereka dengan cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!