在 UnmarshalJSON 中调用 json.Unmarshal 时避免堆栈溢出
在自定义 UnmarshalJSON 实现中调用 json.Unmarshal(b, type) 可能会导致导致堆栈溢出错误。出现这种情况是因为 JSON 解码器反复尝试查找该类型的自定义 UnmarshalJSON 实现,从而导致无限循环。
解决方案:创建新类型
避免这个问题,使用 type 关键字创建一个新类型。这个新类型不会继承原始类型的方法,包括 UnmarshalJSON。
type person2 Person
用法:
使用 a 将原始类型的值转换为新类型类型转换:
if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err }
示例:
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Custom processing if p.Age < 0 { p.Age = 0 } return nil }
好处:
以上是在 UnmarshalJSON 中使用 json.Unmarshal 时如何防止堆栈溢出错误?的详细内容。更多信息请关注PHP中文网其他相关文章!