网络编程
位置:首页>> 网络编程>> Go语言>> Go json自定义Unmarshal避免判断nil示例详解

Go json自定义Unmarshal避免判断nil示例详解

作者:k8scat  发布时间:2024-01-29 18:44:24 

标签:Go,json,自定义,Unmarshal

前言

腾讯《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)
}

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

来源:https://k8scat.com/posts/go/json-custom-unmarshal/

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com