JSON 编组接口的异常返回类型
在使用 json.Unmarshal 将字节数组转换为接口{}的场景中,当返回映射而不是预期的结构类型时,可能会出现意外结果。这种差异可以归因于interface{}类型的抽象性质,使得json包无法辨别底层结构结构。
要纠正这种异常,建议显式传递指向所需的指针struct,将其转换为抽象接口。这种方法允许 json 包相应地识别和反序列化结构。
例如,以下修改后的代码片段说明了所需的行为:
<code class="go">func bad() { var ping interface{} = &Ping{} // Pass a pointer to Ping as an interface deserialize([]byte(`{"id":42}`), ping) fmt.Println("DONE:", ping) // Now outputs a Ping struct }</code>
或者,如果访问指针是不可行,可以利用动态分配来创建可以反序列化的新指针。然后可以使用新值更新原始 interface{} 值。
<code class="go">func bad() { var ping interface{} = Ping{} nptr := reflect.New(reflect.TypeOf(ping)) deserialize([]byte(`{"id":42}`), nptr.Interface()) ping = nptr.Interface() fmt.Println("DONE:", ping) // Outputs a Ping struct }</code>
通过采用其中一种技术,json.Unmarshal 函数可以准确地将字节数组反序列化为所需的结构类型,从而消除意外的地图返回值。
以上是## 为什么 `json.Unmarshal` 在解组到接口{}时返回映射而不是结构?的详细内容。更多信息请关注PHP中文网其他相关文章!