阅读 234

Go json 自定义 Unmarshal 避免判断 nil

腾讯《Go安全指南》中提到【必须】nil指针判断:进行指针操作时,必须判断该指针是否为nil,防止程序panic,尤其在进行结构体Unmarshal时。但如果每次使用都要判断一下是否 nil 防止 panic的话,那么这样的代码就会比较麻烦,这里我们可以使用一个自定义的方法,来避免这种情况。

使用默认的 Unmarshal 方法

package main import (     "encoding/json"     "fmt" ) type A struct {     Name string `json:"name"`     Num  *int   `json:"num"` } func main() {     var a A     err := json.Unmarshal([]byte(`{"name": "hsowan"}`), &a)     if err != nil {         panic(err)     }     fmt.Println(a.Name)     // 每次使用都要判断一下是否 nil 防止 panic     if a.Num != nil {         fmt.Println(*a.Num)     } } 复制代码

自定义的 Unmarshal 方法

当字段为 nil 时,在 Unmarshal 时进行初始化,这样就可以避免使用的时候发生 panic, 同时也不需要在使用的时候判断是否为 nil 了。

package main import (     "encoding/json"     "fmt" ) type A struct {     Name string `json:"name"`     Num  *int   `json:"num"` } func (a *A) UnmarshalJSON(b []byte) error {     type alias A     aux := (*alias)(a)     if err := json.Unmarshal(b, &aux); err != nil {         return err     }     if aux.Num == nil {         aux.Num = new(int)     }     return nil } func main() {     var a A     err := json.Unmarshal([]byte(`{"name": "hsowan"}`), &a)     if err != nil {         panic(err)     }     fmt.Println(a.Name)     fmt.Println(*a.Num) }


作者:K8sCat
链接:https://juejin.cn/post/7037892572307521573
来源:稀土掘金


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐