我是靠谱客的博主 知性啤酒,这篇文章主要介绍Go json自定义Unmarshal避免判断nil示例详解,现在分享给大家,希望可以做个参考。

前言

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

使用默认的 Unmarshal 方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 了。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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) }

参考 : 自定义Go Json的序列化方法 

以上就是Go json自定义Unmarshal避免判断nil示例详解的详细内容,更多关于Go json自定义Unmarshal的资料请关注靠谱客其它相关文章!

最后

以上就是知性啤酒最近收集整理的关于Go json自定义Unmarshal避免判断nil示例详解的全部内容,更多相关Go json自定义Unmarshal避免判断nil示例详解内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部