在 UnmarshalJSON 中调用 json.Unmarshal 而不会导致堆栈溢出
问题:
UnmarshalJSON 的自定义实现调用 json.Unmarshal 会导致堆栈
解决方案:
要避免在 UnmarshalJSON 中调用 json.Unmarshal 时出现堆栈溢出问题,请使用以下技术:
推理:
使用 type 关键字创建新类型会有效地删除原始类型中的所有方法。当在解组过程中使用包装器类型时,JSON 解码器将找不到自定义的 UnmarshalJSON 实现,并将使用默认的实现。这可以防止堆栈溢出问题。
示例:
考虑带有 Age 字段的 Person 类型:
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type personWrapper Person if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil { return err } // Post-processing after unmarshaling: if p.Age < 0 { p.Age = 0 } return nil }
此技术允许自定义解组后进行后处理,同时避免与调用 json.Unmarshal 相关的堆栈溢出问题解组JSON。
以上是在 `UnmarshalJSON` 中调用 `json.Unmarshal` 时如何避免堆栈溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!