將映射[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中文網其他相關文章!