假设特定结构上的json.Marshall不可能失败是否安全?

Sal*_*ali 0 go

我已经读过这个问题,询问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
}
Run Code Online (Sandbox Code Playgroud)

可能doSomething会失败吗?如果是,请提供意见,否则解释原因.根据我目前的知识,它不能.

Art*_*Art 6

我可以在这里看到三个潜在的错误来源:

  1. 字符串和各种UTF8的东西

  2. Int64的.JSON中的数字通常被视为float64,因此一个迂腐的实现可能会为绝对值大于2 ^ 53的数字返回错误,因为它们可能很危险.

  3. 反映.

当前没有发生1和2(编码/ json中的函数不返回错误或恐慌).我没有挖掘反映验证代码3,但这是一个可以试验的案例.要么是第一次尝试失败,要么总是有效.

另一方面.在过去,如果字符串包含无效的UTF8字符,json编码器将返回错误.它不再那样做,但这指出了一个重要的原则 - 事情发生了变化.仅仅因为今天没有返回某个错误并不意味着将来不会出现错误.该函数被定义为返回错误.这意味着标准库开发人员在将来可能不会出现错误的情况下开始返回新错误是完全有效的.所以答案是 - 是的,它可能会失败.也许不是今天,但依赖于特定版本的标准库的代码是错误的代码.