Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengendalikan Penegasan Jenis dengan Cekap Selepas Menyahmarshall JSON ke dalam antara muka{} dalam Go?
Dalam senario ini, rentetan JSON dihantar melalui RabbitMQ. Rentetan ini mewakili contoh dua struct berbeza, Somthing1 dan Somthing2. Matlamatnya adalah untuk menyahmarshal rentetan JSON kembali ke dalam struct masing-masing dan melakukan penegasan jenis.
Pada pandangan pertama, nampaknya unmarshalling ke dalam antara muka{} dan kemudian menggunakan penegasan jenis sepatutnya memadai. Walau bagaimanapun, apabila dibongkar, pembolehubah input adalah daripada jenis peta[rentetan]antara muka{}. Ini tidak seperti yang dijangkakan dan percubaan untuk menghidupkan jenis ini atau menetapkannya semula kepada struct yang diingini gagal.
Pustaka JSON di Golang menyahmarshal menjadi jenis lalai seperti bool, float64 , dan peta[rentetan]antara muka{}. Untuk mendapatkan struct yang diingini, anda perlu menyahmarshal terus ke dalamnya atau menukar secara manual daripada peta[rentetan]antara muka{}.
Pendekatan pilihan adalah untuk menyahmarshal terus ke dalam structs:
func typeAssert(msg string) { var job Somthing1 json.Unmarshal([]byte(msg), &job) // ... var stats Somthing2 json.Unmarshal([]byte(msg), &stats) // ... }
Jika unmarshalling secara langsung tidak boleh dilaksanakan, anda boleh menggunakan struct Unpacker untuk mengendalikan unmarshalling dan menyediakan antara muka untuk mengakses data:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { // Attempt to unmarshal into both types smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Kemudian, anda boleh menggunakan Unpacker untuk mengakses data unmarshalling:
func typeAssert(msg string) { unpacker := &Unpacker{} json.Unmarshal([]byte(msg), unpacker) switch v := unpacker.Data.(type) { case Something1: // ... case Something2: // ... default: // Handle unknown type } }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Penegasan Jenis dengan Cekap Selepas Menyahmarshall JSON ke dalam antara muka{} dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!