解组 JSON:指针与引用
json.Unmarshal 函数允许我们将 JSON 数据转换为 Go 结构体。虽然文档表明如果指针为零,它可以分配一个新值,但事实并非如此。
考虑以下示例:
var animals Animal err := json.Unmarshal(jsonBlob, &animals)
这按预期工作,因为动物是非零指针。但是,如果我们将 Animals 更改为未初始化的指针:
var animals *Animal err := json.Unmarshal(jsonBlob, animals)
此操作会失败,并显示模糊的错误消息:
json: Unmarshal(nil *main.Animal)
此错误源于 InvalidUnmarshalError,当无效时会抛出该错误参数被传递给 Unmarshal。文档没有明确声明指针必须为非 nil,这可能会导致混乱。
文档中的冲突引用表明 Unmarshal 可以为 nil 指针分配新值,可能是指到 Reflect.New 函数的行为,Unmarshal 在内部使用该函数在指针为 nil 时创建一个新值。但是,reflect.New 仅适用于某些类型,例如结构和切片。它不适用于指向原始类型的指针,例如 *int 或 *string。
总之,json.Unmarshal 需要一个非 nil 指针作为其第二个参数。它不能为原始类型的 nil 指针分配新值。因此,在尝试将 JSON 数据解组到其中之前,确保指针不为 nil 非常重要。
以上是为什么 `json.Unmarshal` 因指向原始类型的 Nil 指针而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!