Pensirilan/Penyahserikatan JSON Generik untuk Soket Web dalam Go
Apabila bekerja dengan soket web, keperluan sering timbul untuk mensiri dan menyahsiri data JSON untuk komunikasi antara klien dan pelayan. Satu cabaran biasa ialah mengendalikan mesej masuk daripada jenis yang berbeza, seperti struct dengan medan yang berbeza-beza.
Dalam senario ini, menggunakan soket web gorila dan JSON untuk penyirian dan penyahsirilan, mungkin menyusahkan untuk menentukan jenis bagi setiap mesej secara eksplisit . Fungsi conn.ReadJSON() memerlukan jenis khusus disediakan, yang tidak selalunya praktikal apabila berurusan dengan berbilang jenis mesej.
Penyelesaian Generik Menggunakan Kawalan JSON
Penyelesaian generik melibatkan penentuan struct yang mengandungi medan kawalan yang menunjukkan jenis mesej. Medan kawalan ini membenarkan atur cara menentukan struktur data khusus untuk digunakan untuk penyahserikatan.
type Messages struct { Control string `json:"control"` X json.RawMessage }
Struktur Mesej ini termasuk medan Kawalan dan medan X, yang boleh menyimpan sebarang jenis data JSON sebagai mesej mentah .
Menyahserialisasi dan Mengendalikan Mesej
Apabila menerima mesej menggunakan conn.ReadJSON(), data boleh disimpan dalam struct Messages. Medan Kawalan kemudiannya boleh digunakan untuk menentukan jenis data sebenar yang disimpan dalam medan X.
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 the Bar struct }
Dalam contoh ini, jika medan Kawalan ialah "Foo", medan X dinyahsiri menjadi Foo struct menggunakan json.Unmarshal(). Proses ini boleh diulang untuk jenis mesej lain.
Faedah pendekatan ini:
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Pensirilan/Deserialisasi JSON untuk Pelbagai Jenis Mesej dalam Soket Web Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!