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/


猜你喜欢
- 维护是什么,维护就是修改,不断的修改,但是要保证你的html和css有清晰的版本界定,有扩展性,不要因为做的太死而重新去做这个页面。一个赚钱
- 现有:班级表(A_CLASS)学生表( STUDENT)注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID代
- 本文实例讲述了Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法。分享给大家供大家参考。具体如下:这个东东本来是做来给公司数据
- privot多对多关系的中间表。PT5框架会自动把privot带上。我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模
- 前言读取站点资料数据对站点数据进行插值,插值到规则网格上绘制EOF第一模态和第二模态的空间分布图绘制PC序列关于插值,这里主要提供了两个插值
- python实现原图裁剪为固定尺寸小图的具体代码,供大家参考,具体内容如下讲解1、代码效果:实现原图裁剪为固定尺寸小图代码import nu
- 新年新气象,今天就用代码来制作一个 动态鞭炮 ,效果如下所示。动态鞭炮的基本原理是:将一个录制好的鞭炮视频以字符画的形式复现,基本步骤是帧采
- 客户用的数据库是mysql,而研发好的产品支持oracle,为了让客户掏腰包,我们必须把数据库环境从oracle转向mysql。我们在转换的
- 1、复杂SQL查询1.1、单表查询(1)选择指定的列[例]查询全体学生的学号和姓名select Sno as 学号,Sname as 姓名
- 1 将文件保存到服务器本地upload.html<!DOCTYPE html><html lang="en&qu
- 一、Python 下载Python是运行的环境,必不可少,如果你是Linux系统的话,不用安装,自带了Python。首先我们打开浏览器搜索P
- models.py:from django.db import models # 出版社class Publisher(models.Mod
- 1. 正则表达式的应用在给用户发送消息时通常情况会有相同的消息模板,但其中部分信息跟用户相关,因此需要对消息模板中的变量部分进行替换。而对于
- 1.数据库事务的基本特性。原子性:事务中的所有操作要么全部提交成功,要么全部失败回滚。场景:UPDATE cs_user SET age =
- 一、迭代器迭代器就是iter(可迭代对象函数)返回的对象,说人话.......可迭代对象由一个个迭代器组成可以用next()函数获取可迭代对
- 误区 #12:TempDB的文件数和需要和CPU数目保持一致错误 哎,由于上述误区是微软“官方”的建议,
- python条件语句使用 if 表达式,难度不高,需要注意的是嵌套用法,以及如何设置对应的条件。if 条件判断语句python 语句是按固定
- 最近在改一个嵌入在frame中的页面的时候,使用了jquery做效果,而页面本身也绑定了onload事件。改完后,Firefox下测试正常流
- Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4
- 左为旧版,右为更新到1.0版本后的名字定义变量的更新tf.VARIABLES ——> tf.GLOBAL_VARIABLEStf.al