Go json 自定义 Unmarshal 避免判断 nil

时间:2025-03-08 07:38:12

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

使用默认的 Unmarshal 方法

  1. package main
  2. import ("encoding/json""fmt"
  3. )
  4. type A struct {Name string `json:"name"`Num*int `json:"num"`
  5. }
  6. func main() {var a Aerr := ([]byte(`{"name": "hsowan"}`), &a)if err != nil {panic(err)}()// 每次使用都要判断一下是否 nil 防止 panicif != nil {(*)}
  7. }

自定义的 Unmarshal 方法

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

  1. package main
  2. import ("encoding/json""fmt"
  3. )
  4. type A struct {Name string `json:"name"`Num*int `json:"num"`
  5. }
  6. func (a *A) UnmarshalJSON(b []byte) error {type alias Aaux := (*alias)(a)if err := (b, &aux); err != nil {return err}if == nil { = new(int)}return nil
  7. }
  8. func main() {var a Aerr := ([]byte(`{"name": "hsowan"}`), &a)if err != nil {panic(err)}()(*)
  9. }