Marshaling map[string]rentetan kepada JSON: Bilakah Ia Boleh Mengembalikan Ralat?
Pertimbangkan coretan kod berikut:
m := map[string]string{} //... do stuff to the map b, err := json.Marshal(m)
Biasanya, menyusun rentetan[rentetan] peta kepada JSON tidak mengembalikan ralat. JSON menyokong rentetan sebagai kedua-dua kunci dan nilai, dan Go mengekod nilai rentetan sebagai urutan UTF-8 bait. Malah aksara UTF-8 yang tidak sah digantikan dengan aksara gantian Unikod.
m := map[string]string{"\xff": "a"} data, err := json.Marshal(m) // Output: {"\ufffd":"a"} <nil>
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa ralat yang dikembalikan harus sentiasa disemak, walaupun dokumentasi menyatakan bahawa ralat itu biasanya tiada.
Isu berpotensi yang lebih kabur timbul apabila rentetan[rentetan] peta diserahkan kepada json.Marshal() serentak. Sejak Go 1.6, masa jalan mungkin mengesan penyalahgunaan peta secara serentak. Jika utas mengubah suai peta manakala utas lain melelang ke atasnya, masa jalan mungkin ranap aplikasi dengan mesej "ralat maut: lelaran peta serentak dan tulis peta".
Situasi ini boleh dicetuskan seperti itu:
m := map[string]string{"\xff": "a"} go func() { for i := 0; i < 10000; i++ { m["x"] = "b" } }() for i := 0; i < 10000; i++ { if _, err := json.Marshal(m); err != nil { panic(err) } } // Output: fatal error: concurrent map iteration and map write
Oleh itu, adalah penting untuk memastikan penyegerakan yang betul apabila mengubah suai dan menyusun peta secara serentak.
Atas ialah kandungan terperinci Bilakah `json.Marshal` Gagal Apabila Marshaling `map[rentetan]rentetan` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!