Pernyataan Masalah
Apabila menggunakan json.Unmarshal Go untuk menyahkod rentetan daripada sistem mesej, didapati bahawa hasilnya ialah peta[rentetan]antara muka{} dan bukannya yang dijangkakan jenis struct (Somthing1 atau Somthing2), menjadikan penegasan jenis mustahil.
Punca Punca
Fungsi json.Unmarshal, apabila menyahmarshaling ke dalam antara muka{}, lalai kepada diketahui jenis seperti []antara muka{} dan peta[rentetan]antara muka{}. Dalam kod yang diberikan, input pemboleh ubah antara muka menerima peta[rentetan]antara muka{} yang mewakili data JSON yang tidak dikawal, tetapi pernyataan suis cuba untuk menegaskannya sebagai Somthing1 atau Somthing2 secara langsung.
Penyelesaian
Memandangkan JSON tidak secara asalnya dibongkar ke dalam struct yang dikehendaki, terdapat dua pilihan untuk menangani perkara ini isu:
1. Periksa dan Tukar daripada Peta Generik:
Satu pendekatan adalah untuk memeriksa antara muka [rentetan] peta{} dan membongkar data secara manual ke dalam jenis struct yang sesuai. Walau bagaimanapun, ini memerlukan pengendalian yang teliti terhadap kemungkinan ralat dan penetapan nilai secara manual.
2. Gunakan JSON Unmarshaller Tersuai:
Penyelesaian yang lebih bersih adalah untuk mencipta JSON unmarshaller tersuai untuk mengendalikan proses unmarshaler. Unmarshaller tersuai ini boleh membezakan jenis struct yang betul berdasarkan data JSON dan unmarshaller dengan sewajarnya. Berikut ialah contoh unmarshaller sedemikian:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) // no error, but we also need to make sure we unmarshaled something if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } // abort if we have an error other than the wrong type if _, ok := err.(*json.UnmarshalTypeError); err != nil && !ok { return err } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Dengan menghantar contoh unmarshaller tersuai ini kepada json.Unmarshal, medan Data yang terhasil akan mengandungi data unmarshaled dalam jenis struct yang betul, membenarkan penegasan jenis lancar .
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyahmarshal Data JSON Dengan Cekap ke dalam Struktur Khusus Apabila Menggunakan `json.Unmarshal` Go dengan `antara muka{}`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!