欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?json自定義Unmarshal避免判斷nil示例詳解

 更新時間:2022年06月17日 14:38:02   作者:k8scat  
這篇文章主要為大家介紹了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)文章

  • golang快速實現(xiàn)網(wǎng)頁截圖的方法

    golang快速實現(xiàn)網(wǎng)頁截圖的方法

    這篇文章主要介紹了golang快速實現(xiàn)網(wǎng)頁截圖的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • goland設置顏色和字體的操作

    goland設置顏色和字體的操作

    這篇文章主要介紹了goland設置顏色和字體的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • B站新一代 golang規(guī)則引擎gengine基礎語法

    B站新一代 golang規(guī)則引擎gengine基礎語法

    這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言基礎入門應用簡介及常用命令

    Go語言基礎入門應用簡介及常用命令

    這篇文章主要為大家介紹了Go語言基礎入門應用簡介及常用命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • 詳解Golang中日志庫glog的使用

    詳解Golang中日志庫glog的使用

    golang/glog?是?C++?版本?google/glog?的?Go?版本實現(xiàn),基本實現(xiàn)了原生?glog?的日志格式,下面大家就跟隨小編一起了解一下glog的具體使用吧
    2023-09-09
  • Go標準庫http?server優(yōu)雅啟動深入理解

    Go標準庫http?server優(yōu)雅啟動深入理解

    這篇文章主要介紹了Go標準庫http?server優(yōu)雅啟動深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang中常見的三種并發(fā)控制方式使用小結(jié)

    Golang中常見的三種并發(fā)控制方式使用小結(jié)

    這篇文章主要為大家詳細介紹了如何對goroutine并發(fā)行為的控制,在Go中最常見的有三種方式:sync.WaitGroup、channel和Context,下面我們就來看看他們的具體使用吧
    2024-01-01
  • 淺談GoLang幾種讀文件方式的比較

    淺談GoLang幾種讀文件方式的比較

    這篇文章主要介紹了淺談GoLang幾種讀文件方式的比較,一般來說常用的有三種。使用Read加上buffer,使用bufio庫和ioutil 庫,非常具有實用價值,需要的朋友可以參考下
    2019-01-01
  • 解決go獲取文件md5值不正確的問題

    解決go獲取文件md5值不正確的問題

    本文主要介紹了解決go獲取文件md5值不正確的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • Golang拾遺之實現(xiàn)一個不可復制類型詳解

    Golang拾遺之實現(xiàn)一個不可復制類型詳解

    在這篇文章中我們將實現(xiàn)一個無法被復制的類型,順便加深對引用類型、值傳遞以及指針的理解。文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-02-02

最新評論