说我有以下代码:
m := map[string]string{}
//... do stuff to the map
b, err := json.Marshal(m)
在这种情况下,有什么办法可以使json.Marshal
调用返回错误?
我想知道,部分原因是出于好奇,另一部分是考虑是否需要担心该错误检查。
由于任何有效值string
都是有效键,而且也是JSON中的有效值(有关详细信息,请参阅JSON键名中的哪些字符有效/无效?,因此从理论上讲,它不会返回任何错误。
如果发生内存不足错误,则json.Marshal()
不会返回错误,您的应用将终止并显示错误代码。
由于Go将string
值存储为其UTF-8编码的字节序列,因此存在无效的UTF-8编码的字符串内容的问题。这也不会导致任何错误,因为Go会将无效的代码点替换为Unicode替换字符U+ FFFD,例如以下示例:
m := map[string]string{"\xff": "a"}
data, err := json.Marshal(m)
fmt.Println(string(data), err)
输出(在Go Playground上尝试):
{"\ufffd":"a"} <nil>
此行为记录在json.Marshal()
:
字符串值编码为强制转换为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。
封送a map[string]string
可能永远不会返回错误,但是,除非文档明确指出返回error
的总是nil
(除非docjson.Marshal()
并未记录这种行为),否则应始终检查返回的错误。这种罕见的例子是rand.Read()
哪个文档_“总是返回len(p)和nil错误”_ 。
而且标准库也有可能存在错误,因此,即使json
封包的实现可能在封送a时不 打算
返回任何错误map[string]string
,但错误可能会导致它仍然返回非nil
错误。
为了完整起见,让我们讨论json.Marshal()
将a map[string]string
传递给它时可能导致失败的另一个问题。
Go
1.6向
运行时添加了轻量级的并发滥用映射检测功能
这意味着Go运行时可以检测是否在goroutine中读取或修改了映射,并且还同时由另一个goroutine修改了该映射,而无需同步。
因此,这里的情况是我们将传递map[string]string
给json.Marshal()
。而要使其封送,该json
程序包显然必须遍历地图的键值。如果我们同时修改地图,将导致失败。
这是激发它的示例代码(存在循环以增加并发修改的可能性,否则我们将由goroutine调度程序处理):
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)
}
}
还要注意,在这种情况下json.Marshal()
也不会返回(就像发生内存不足错误一样),而是运行时将有意使您的应用程序崩溃。输出将是:
fatal error: concurrent map iteration and map write
在这种情况下,调用是否会返回错误? 我想知道部分是出于好奇,部分是考虑我是否需要担心错误检查。
问题内容: 有人可以向我解释为什么返回类型 只是返回类型 我不明白为什么地图会映射到一个以上的值。TIA。 问题答案: 它返回具有 相同 名称的控件的所有参数值。 例如: 要么 任何选中/选择的值都将以以下形式出现: 对于表中的多个选择它也很有用: 与…结合
问题内容: 从来源来看,我无法影响我在地图中获得的数据,该地图以表示。 我需要处理所包含的数据,最好是(其中的数据非常适合该处理)。 我还需要从数据中生成键列表,因为这些键是事先未知的。 我可以在网上找到的大多数类似问题或多或少都说这是不可能的,但是如果我的地图是,则表明数据在那里,可读性为。 我该怎么办fmt.Println可以做什么? 问题答案: 处理未知接口的一种安全方法,只需使用fmt.S
我的REST控制器需要以下格式的请求输入,它成功地将其转换为包含映射和字符串作为参数的Java对象: 我从html表单中获取数据,如下所示: 基本上,这段代码可以归结为: 这会导致包含{key1=的映射 但是,我最终会得到以下字符串:'{"myMap":{},"String":"myString"}'。所以我可能必须做一些不同的事情来对地图进行字符串化,但是我尝试的都不起作用。 有人能帮我吗?
编辑#2:这可能与记忆有关。日志正在堆外显示。 是的,肯定与记忆有关。基本上docker日志会报告java堆外的所有速度,但jupyter web笔记本不会将其传递给用户。相反,用户会遇到内核故障和偶尔的奇怪行为,比如代码编译不正确。 Spark 1.6,尤其是docker run-d。。。。jupyter/all spark笔记本电脑 希望统计约100万笔交易中的账户。 这很简单,它可以在没有火
编辑:我把单引号改成双引号,短绒没有抱怨。 我把这个放到jsonlint.com,我得到了这个错误: 其他json棉绒也有类似的结果。最初,数值是空的,所以我用单引号将它们括起来,以消除< code>jq错误: 但我还是为JQ买的。 我没有看到任何未定义的键,我错过了什么? 我还在网上看到一篇参考文章,不允许对密钥使用裸数字,公平地说,任何具有非字符串密钥的JSON都不应该通过测试吗?