Go?json自定義Unmarshal避免判斷nil示例詳解
前言
騰訊《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 時進行初始化,這樣就可以避免使用的時候發(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)容,更多關于Go json自定義Unmarshal的資料請關注腳本之家其它相關文章!
相關文章
B站新一代 golang規(guī)則引擎gengine基礎語法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12

