Bekerja dengan SQL NULL Values dan JSON in Go
Apabila bekerja dengan nilai nullable dalam Go, adalah perkara biasa untuk menggunakan jenis seperti sql.NullInt64 dan sql.NullString. Walau bagaimanapun, jenis ini boleh membawa kepada hasil yang tidak dijangka apabila menjana JSON daripada struct yang mengandunginya. Khususnya, output JSON mungkin termasuk tahap tambahan kerana sql.Null*** juga merupakan struct.
Penyelesaian
Untuk menangani isu ini, satu penyelesaian adalah dengan buat jenis tersuai yang melaksanakan antara muka json.Marshaller dan json.Unmarshaler. Dengan membenamkan jenis sql.NullInt64, anda boleh mengendalikan kaedah SQL dengan lancar sambil mentakrifkan tingkah laku marshaling dan unmarshaling JSON anda sendiri.
Berikut ialah contoh:
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 }
Apabila menggunakan jenis tersuai ini dan bukannya sql.NullInt64, output JSON akan berada dalam format yang anda jangkakan, tanpa tambahan tahap.
Contoh
Anda boleh menguji contoh ini di pautan berikut:
http://play.golang.org/p/zFESxLcd -c
Atas ialah kandungan terperinci Bagaimana Mengendalikan Nilai SQL NULL dan JSON dengan Berkesan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!