Membezakan Medan JSON Ditetapkan kepada Null lwn. Tidak Hadir Semasa Menyahmarshaling
Apabila menyahmarshaling JSON ke dalam struct Golang, pembezaan antara medan ditetapkan kepada null dan bidang yang tidak ada boleh menjadi penting. Kedua-dua senario menghasilkan nilai sifar dalam struct, mengaburkan semantik yang dimaksudkan.
Pembezaan Menggunakan Generik (Go 1.18 )
Go 1.18 memperkenalkan generik, membolehkan penyelesaian yang ringkas generik tunggal jenis:
type Optional[T any] struct { Defined bool Value *T }
Jenis ini merangkumi konsep nilai pilihan dengan keadaan medan yang ditentukan (Ditakrifkan).
Contoh Penggunaan:
type Payload struct { Field1 Optional[string] `json:"field1"` Field2 Optional[int] `json:"field2"` }
Selepas unmarshaling, medan dengan nilai yang ditentukan (Ditakrifkan == benar) boleh membezakan antara nilai nol (Nilai == sifar) dan nilai yang tiada (Ditakrifkan == palsu).
Penyelesaian Pra-Generik
Pembungkus Jenis Tersuai:
type OptionalString struct { Defined bool Value *string } func (os *OptionalString) UnmarshalJSON(data []byte) error { os.Defined = true return json.Unmarshal(data, &os.Value) }
Contoh Penggunaan:
type Payload struct { Field1 string `json:"field1"` Field2 OptionalString `json:"field2"` }
Penghadan:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membezakan Antara JSON Null dan Medan Hilang Apabila Menyahmarshaling dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!