Marshaling JSON ke dalam Antara Muka dalam Go
Apabila berurusan dengan struktur data yang kompleks, selalunya perlu untuk menggabungkan JSON menjadi antara muka{} untuk membolehkan fleksibiliti dan polimorfisme. Artikel ini menyediakan penyelesaian kepada senario tertentu di mana anda ingin menggabungkan JSON menjadi antara muka{} dan menukarnya secara dinamik kepada jenis tertentu berdasarkan nilai medan.
Penerangan Masalah
Pertimbangkan situasi berikut: anda mempunyai jenis Mesej dengan medan antara muka{} yang dipanggil Data. Anda juga mempunyai jenis CreateMessage yang mewakili varian khusus medan Data. Apabila membuka rentetan JSON yang mengandungi kedua-dua arahan ("buat" dalam kes ini) dan data yang sepadan dengan jenis CreateMessage, anda menghadapi isu baki Data sebagai antara muka{}.
Penyelesaian
Untuk menyelesaikan isu ini, anda perlu memanfaatkan sistem jenis Go dan fleksibiliti JSON. Tentukan jenis struct baharu, Mesej, yang membenamkan jenis Mesej asal dan menambah medan RawMessage yang dipanggil Data. RawMessage ialah jenis khas yang disediakan oleh pakej pengekodan/json yang membolehkan anda menyimpan data JSON sewenang-wenangnya tanpa kehilangan maklumat jenis.
type Message struct { Cmd string Data json.RawMessage }
Seterusnya, tentukan jenis struct untuk setiap varian medan Data, dalam ini kes, CreateMessage:
type CreateMessage struct { Conf map[string]int Info map[string]int }
Kini, dalam kod unmarshaling anda, anda boleh menghidupkan nilai medan Cmd dan menyahkod Data kepada jenis konkrit yang sesuai:
switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal(m.Data, &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") }
Pendekatan ini membolehkan anda menyahmarshal JSON ke dalam antara muka{} sambil mengekalkan keupayaan untuk menukarnya kemudian kepada jenis tertentu berdasarkan nilai yang diketahui.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Marshal JSON ke Antara Muka Go{} dan Secara Dinamik Menukarkannya kepada Jenis Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!