Go?json自定義Unmarshal避免判斷nil示例詳解
前言
騰訊《Go安全指南》中提到【必須】nil指針判斷:進行指針操作時,必須判斷該指針是否為nil,防止程序panic,尤其在進行結(jié)構(gòu)體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 時進行初始化,這樣就可以避免使用的時候發(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示例詳解的詳細內(nèi)容,更多關(guān)于Go json自定義Unmarshal的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
B站新一代 golang規(guī)則引擎gengine基礎語法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Golang中常見的三種并發(fā)控制方式使用小結(jié)
這篇文章主要為大家詳細介紹了如何對goroutine并發(fā)行為的控制,在Go中最常見的有三種方式:sync.WaitGroup、channel和Context,下面我們就來看看他們的具體使用吧2024-01-01