Rumah > pembangunan bahagian belakang > Golang > Bilakah `json.Marshal` Gagal Apabila Marshaling `map[rentetan]rentetan` dalam Go?

Bilakah `json.Marshal` Gagal Apabila Marshaling `map[rentetan]rentetan` dalam Go?

Susan Sarandon
Lepaskan: 2024-11-30 09:11:13
asal
236 orang telah melayarinya

When Does `json.Marshal` Fail When Marshaling a `map[string]string` in Go?

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)
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan