我已阅读 this question它询问 json.Marshal 是否可以在任何输入上失败,并且根据它看起来像我的情况的答案它不会失败。我的情况如下:
我有一个特定的结构(没有嵌套,没有数组,只有字符串、各种类型的整数、 bool 值)。我需要将它编码成一个 json。它会失败吗?
更多specific example :
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
会失败吗?如果是,请提供输入,否则请解释原因。根据我目前的知识,它不能。
最佳答案
我在这里可以看到三个潜在的错误源:
字符串和各种 UTF8 内容
int64。 JSON 中的数字通常被视为 float64,因此迂腐的实现可能会为绝对值大于 2^53 的数字返回错误,因为它们可能很危险。
反射(reflection)。
1 和 2 目前没有发生(encoding/json 中的函数不返回错误或 panic )。我还没有深入研究 reflect 的代码来验证 3,但这是那些微不足道的可测试案例之一。它要么在第一次尝试时失败,要么总是有效。
另一方面。过去,如果字符串包含无效的 UTF8 字符,json 编码器会返回错误。它不再那样做,但这指出了一个重要的原则——事情会改变。仅仅因为今天没有返回某个错误并不意味着将来不会有错误。该函数被定义为返回错误。这意味着标准库开发人员在未来开始为今天可能不是错误的事情返回新错误是完全有效的。所以答案是——是的,它可能会失败。也许不是今天,但依赖于特定版本的标准库的代码是糟糕的代码。
关于go - 假设特定结构上的 json.Marshall 不可能失败是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47009077/