首页>>后端>>Golang->Go json 自定义 Unmarshal 避免判断 nil

Go json 自定义 Unmarshal 避免判断 nil

时间:2023-12-01 本站 点击:0

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

使用默认的 Unmarshal 方法

packagemainimport("encoding/json""fmt")typeAstruct{Namestring`json:"name"`Num*int`json:"num"`}funcmain(){varaAerr:=json.Unmarshal([]byte(`{"name":"hsowan"}`),&a)iferr!=nil{panic(err)}fmt.Println(a.Name)//每次使用都要判断一下是否nil防止panicifa.Num!=nil{fmt.Println(*a.Num)}}

自定义的 Unmarshal 方法

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

packagemainimport("encoding/json""fmt")typeAstruct{Namestring`json:"name"`Num*int`json:"num"`}func(a*A)UnmarshalJSON(b[]byte)error{typealiasAaux:=(*alias)(a)iferr:=json.Unmarshal(b,&aux);err!=nil{returnerr}ifaux.Num==nil{aux.Num=new(int)}returnnil}funcmain(){varaAerr:=json.Unmarshal([]byte(`{"name":"hsowan"}`),&a)iferr!=nil{panic(err)}fmt.Println(a.Name)fmt.Println(*a.Num)}

参考

[译]自定义Go Json的序列化方法


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/5838.html