栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在UnmarshalJSON函数中调用json.Unmarshal而不引起堆栈溢出

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在UnmarshalJSON函数中调用json.Unmarshal而不引起堆栈溢出

避免这种情况/避免这种情况发生的一种简单且常见的方法是

type
使用关键字创建一个新类型,并使用类型转换来传递该类型的值(该值可能是您的原始值,因为新的类型具有原始类型作为其基础类型)。

之所以

type
可行,是因为关键字创建了一个新类型,并且该新类型将具有零个方法(它不会“继承”基础类型的方法)。

这会产生一些运行时开销吗?编号。从规格报价:转换:

特定规则适用于数字类型之间或字符串类型之间的(非恒定)转换。这些转换可能会更改的表示形式

x
并产生运行时成本。
所有其他转换只会更改类型,而不会更改的表示形式
x

让我们来看一个例子。我们有一个

Person
带有数字的类型
Age
,我们要确保
Age
不能为负数(小于
0
)。

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}

测试它:

var p *Personfmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":10}`), &p))fmt.Println(p)fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":-1}`), &p))fmt.Println(p)

输出(在Go Playground上尝试):

<nil>&{Bob 10}<nil>&{Bob 0}

当然,相同的技术也适用于自定义封送处理(

MarshalJSON()
):

func (p *Person) MarshalJSON() ([]byte, error) {    // Pre-processing before marshaling:    if p.Age < 0 {        p.Age = 0    }    type person2 Person    return json.Marshal((*person2)(p))}

测试它:

p = &Person{"Bob", 10}fmt.Println(json.NewEnprer(os.Stdout).Enpre(p))p = &Person{"Bob", -1}fmt.Println(json.NewEnprer(os.Stdout).Enpre(p))

输出(在相同的Go Playground示例中):

{"name":"Bob","age":10}<nil>{"name":"Bob","age":0}<nil>

一个非常相似的问题是,当您

String()string
fmt
包定义自定义文本表示方法时,您想使用所修改的默认字符串表示形式。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448108.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号