Go?json自定義Unmarshal避免判斷nil示例詳解
前言
騰訊《Go安全指南》中提到【必須】nil指針判斷:進(jìn)行指針操作時,必須判斷該指針是否為nil,防止程序panic,尤其在進(jìn)行結(jié)構(gòu)體Unmarshal時。但如果每次使用都要判斷一下是否 nil 防止 panic的話,那么這樣的代碼就會比較麻煩,這里我們可以使用一個自定義的方法,來避免這種情況。
使用默認(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 時,在 Unmarshal 時進(jìn)行初始化,這樣就可以避免使用的時候發(fā)生 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的序列化方法
以上就是Go json自定義Unmarshal避免判斷nil示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go json自定義Unmarshal的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Go標(biāo)準(zhǔn)庫http?server優(yōu)雅啟動深入理解
這篇文章主要介紹了Go標(biāo)準(zhǔn)庫http?server優(yōu)雅啟動深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Golang中常見的三種并發(fā)控制方式使用小結(jié)
這篇文章主要為大家詳細(xì)介紹了如何對goroutine并發(fā)行為的控制,在Go中最常見的有三種方式:sync.WaitGroup、channel和Context,下面我們就來看看他們的具體使用吧2024-01-01
Golang拾遺之實現(xiàn)一個不可復(fù)制類型詳解
在這篇文章中我們將實現(xiàn)一個無法被復(fù)制的類型,順便加深對引用類型、值傳遞以及指針的理解。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-02-02

