Go?json自定義Unmarshal避免判斷nil示例詳解
前言
騰訊《Go安全指南》中提到【必須】nil指針判斷:進(jìn)行指針操作時(shí),必須判斷該指針是否為nil,防止程序panic,尤其在進(jìn)行結(jié)構(gòu)體Unmarshal時(shí)。但如果每次使用都要判斷一下是否 nil 防止 panic的話,那么這樣的代碼就會(huì)比較麻煩,這里我們可以使用一個(gè)自定義的方法,來避免這種情況。
使用默認(rèn)的 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 方法
當(dāng)字段為 nil 時(shí),在 Unmarshal 時(shí)進(jìn)行初始化,這樣就可以避免使用的時(shí)候發(fā)生 panic, 同時(shí)也不需要在使用的時(shí)候判斷是否為 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的序列化方法
以上就是Go json自定義Unmarshal避免判斷nil示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go json自定義Unmarshal的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang讀取yaml配置文件的方法實(shí)現(xiàn)
本文主要介紹了golang讀取yaml配置文件的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
通過Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)
這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)一個(gè)linux命令ls命令(命令行工具構(gòu)建),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-01-01
GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
這篇文章主要介紹了GOLANG使用Context管理關(guān)聯(lián)goroutine的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Go語言實(shí)現(xiàn)AOI區(qū)域視野管理流程詳解
在游戲中,場(chǎng)景里存在大量的物體.如果我們把所有物體的變化都廣播給玩家.那客戶端很難承受這么大的壓力.因此我們肯定會(huì)做優(yōu)化.把不必要的信息過濾掉.如只關(guān)心玩家視野所看到的.減輕客戶端的壓力,給玩家更流暢的體驗(yàn)2023-03-03
使用go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議
本文主要介紹了go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
深入理解Golang?Channel?的底層結(jié)構(gòu)
這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來深入解析一下?channel,需要的朋友可以參考下2022-01-01

