在没有堆栈溢出的情况下编组和解组 JSON
在 JSON 编码中,在 UnmarshalJSON 方法中调用 json.Unmarshal 可能会导致堆栈溢出。出现此问题的原因是解码器不断搜索自定义 UnmarshalJSON 实现,在本例中该实现被重复调用。
为了避免这种情况,常见的解决方案是使用 type 关键字创建新类型。这种新类型有效地充当原始类型的包装器。通过将原始值转换为新类型并将其传递给 json.Unmarshal,可以防止堆栈溢出。
这种方法非常高效,因为类型转换不会更改数据的表示。根据 Go 规范,非数字类型转换仅修改类型,而不改变底层表示。
在以下示例中,使用数字 Age 字段定义 Person 类型。自定义 UnmarshalJSON 方法可确保年龄永远不会为负数:
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 } // Post-processing after unmarshaling if p.Age < 0 { p.Age = 0 } return nil }
此技术也可以应用于自定义编组 (MarshalJSON) 方法,以在数据序列化之前执行预处理。
记住,在为自定义文本表示定义 String() 方法时,必须区分使用 t 和 *t 以避免无意中修改默认字符串代表。
以上是在 Go 中编组和解组 JSON 时如何避免堆栈溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!