首页 > 后端开发 > Golang > 在 Go 中编组'map[string]string”时,'json.Marshal”什么时候会失败?

在 Go 中编组'map[string]string”时,'json.Marshal”什么时候会失败?

Susan Sarandon
发布: 2024-11-30 09:11:13
原创
236 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板