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

标签 go

我已阅读 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 会失败吗?如果是,请提供输入,否则请解释原因。根据我目前的知识,它不能。

最佳答案

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

  1. 字符串和各种 UTF8 内容

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

  3. 反射(reflection)。

1 和 2 目前没有发生(encoding/json 中的函数不返回错误或 panic )。我还没有深入研究 reflect 的代码来验证 3,但这是那些微不足道的可测试案例之一。它要么在第一次尝试时失败,要么总是有效。

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

关于go - 假设特定结构上的 json.Marshall 不可能失败是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47009077/

相关文章:

docker - 如何通过golang获取容器ID

Gosublime:它如何在工作时向我显示函数的参数信息

Golang - 根据地址计算字段索引

macos - 可执行文件不从 PATH 变量中搜索

Gorilla mux,计算所有传入请求

windows - 将 Eclipse 配置为 Go IDE

bash - 如何使用 bash -c 启动程序,重定向/禁用该应用程序的 GUI

google-app-engine - 只能从 Google App Engine golang 应用程序访问请求日志

Golang 工厂方法

go - 在Go中跨字节编码20位数字