我已阅读this question,询问json.Marshal是否可以在任何输入上失败,并根据我的情况看起来的答案,它不会失败。我的情况如下:
我有一个特定的结构(没有嵌套,没有数组,只有字符串,各种类型的整数,bools)。我需要把它整理成一个json。它会失败吗?
type some struct {
F1 string `json:"f1"`
F2 uint32 `json:"f2"`
F3 int64 `json:"f3"`
F4 bool `json:"f4"`
}
func doSomething(s some) (string, error) {
data, err := json.Marshal(s)
if err != nil {
return "", err
}
return string(data), nil
}
doSomething
会失败吗?如果是,请提供意见,否则解释原因。根据我目前的知识,它不能。
答案 0 :(得分:6)
我可以在这里看到三个潜在的错误来源:
字符串和各种UTF8内容
的int64。 JSON中的数字通常被视为float64,因此迂腐实现可能会为绝对值大于2 ^ 53的数字返回错误,因为它们可能很危险。
反映。
1和2目前没有发生(编码中的函数/ json不会返回错误或恐慌)。我还没有深入研究反映验证3的代码,但这是一个简单可测试的案例之一。要么是第一次尝试失败,要么总是有效。
另一方面。在过去,如果字符串包含无效的UTF8字符,json编码器将返回错误。它不再那样做,但这指出了一个重要的原则 - 事情发生了变化。仅仅因为今天没有返回某个错误并不意味着将来不会出现错误。该函数被定义为返回错误。这意味着标准库开发人员在将来可能不会出现错误的情况下开始返回新错误是完全有效的。所以答案是 - 是的,它可能会失败。也许不是今天,但依赖于特定版本的标准库的代码是错误的代码。