首页 >后端开发 >Golang >在 Go 中编组和解组 JSON 时如何避免堆栈溢出?

在 Go 中编组和解组 JSON 时如何避免堆栈溢出?

Patricia Arquette
Patricia Arquette原创
2024-12-26 18:52:14642浏览

How to Avoid Stack Overflow When Marshaling and Unmarshaling JSON in Go?

在没有堆栈溢出的情况下编组和解组 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn