Menyahserialisasi Mesej Soket Web JSON sebagai Jenis Kesatuan dalam Go
Dalam Go, perpustakaan soket web gorila biasanya digunakan untuk mengendalikan sambungan soket web. Walau bagaimanapun, apabila menggunakan JSON untuk penyiaran dan penyahsirilan, pengendalian mesej masuk daripada pelbagai jenis memberikan cabaran.
Pertimbangkan contoh berikut di mana anda mempunyai struktur untuk jenis mesej "Foo" dan "Bar":
type Foo struct { A string `json:"a"` B string `json:"b"` } type Bar struct { C string `json:"c"` D string `json:"d"` }
Fungsi conn.ReadJSON Gorilla membolehkan anda menyahsiri mesej JSON yang masuk ke dalam struktur tertentu. Walau bagaimanapun, anda perlu menggunakan panggilan conn.ReadJSON(Foo) dan conn.ReadJSON(Bar) yang berasingan untuk mengendalikan mesej pelbagai jenis, yang tidak cekap dan menyusahkan.
Untuk menangani perkara ini, anda boleh menggunakan perantara struct yang mengandungi medan kawalan dan medan untuk menyimpan data mesej sebenar:
type Messages struct { Control string `json:"control"` X json.RawMessage }
Medan Kawalan menunjukkan jenis muatan dan X memegang data JSON mentah. Untuk menyahsiri mesej masuk menggunakan pendekatan ini:
var m Messages err := c.ReadJSON(&m) if err != nil { // Handle error } switch m.Control { case "Foo": var foo Foo if err := json.Unmarshal([]byte(m.X), &foo); err != nil { // Handle error } // Do something with foo case "Bar": // Follow the same pattern for handling Bar }
Penyelesaian ini membolehkan anda menyahsiri mesej masuk tanpa mengira jenisnya, menggunakan jenis antara muka RawMessage dalam json.RawMessage. Pernyataan suis menyemak medan kawalan untuk menentukan jenis mesej sebenar dan menyahsiri dengan sewajarnya.
Atas ialah kandungan terperinci Bagaimana untuk Menyahserialisasikan Mesej Soket Web JSON sebagai Jenis Kesatuan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!