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!