首頁 > 後端開發 > Golang > 在 Go 中編組「map[string]string」時,「json.Marshal」什麼時候會失敗?

在 Go 中編組「map[string]string」時,「json.Marshal」什麼時候會失敗?

Susan Sarandon
發布: 2024-11-30 09:11:13
原創
249 人瀏覽過

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

將映射[string]字串編組為 JSON:什麼時候可以回傳錯誤?

考慮以下程式碼片段:

m := map[string]string{}
//... do stuff to the map
b, err := json.Marshal(m)
登入後複製

通常,將 map[string]string 編組為 JSON 不會回傳錯誤。 JSON 支援字串作為鍵和值,Go 將字串值編碼為 UTF-8 位元組序列。即使無效的 UTF-8 字元也會被替換為 Unicode 替換字元。

m := map[string]string{"\xff": "a"}
data, err := json.Marshal(m)
// Output: {"\ufffd":"a"} <nil>
登入後複製

但是,請務必注意,應始終檢查傳回的錯誤,即使文件指出錯誤通常為 nil。

當 map[string]string 同時傳遞給 json.Marshal() 時,會出現一個更隱密的潛在問題。從 Go 1.6 開始,運行時可能會偵測到已對應的同時濫用。如果一個執行緒修改映射,而另一個執行緒迭代它,則執行時可能會導致應用程式崩潰,並顯示「致命錯誤:並發映射迭代和映射寫入」訊息。

這種情況可以像這樣引發:

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
登入後複製

因此,在同時修改和編組映射時確保正確同步至關重要。

以上是在 Go 中編組「map[string]string」時,「json.Marshal」什麼時候會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板