将映射[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中文网其他相关文章!