亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言omitempty選項的實現(xiàn)

 更新時間:2023年06月08日 09:13:35   作者:黎明?  
本文主要介紹了Go語言omitempty選項的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在使用Golang的時候,不免會使用Json和結構體的相互轉換,這時候常用的就是 json.Marshal 和 json.Unmarshal 兩個函數(shù)。這時候在定義json結構體的時候,我們會用到 omitempty 這個字段,這個字段作用就是 空值省略,看似簡單,但是卻有很多小坑,這篇文章帶你稍微研究一下他的用途和功能。

omit:

v. 刪除; 忽略; 漏掉; 遺漏; 不做; 未能做;

adj. 省略了的;省去的;

基本用法

當我們設置json的struct的時候,會定義每個字段對一個json的格式,比如定義一個dog 結構體:

type Dog struct {
    Name   string
    Weight int
}

現(xiàn)在我們對他進行初始化,將其編碼為JSON格式:

func main() {
    d := Dog{
        Name:   "小黑",
        Weight: 20,
    }
    marshalDog, err := json.Marshal(d)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(string(marshalDog))
}

則輸出的結果為:

{"Name":"小黑","Weight":20} 

現(xiàn)在假如有一個結構體變量我們沒初始化,那么結果可能也會跟我們預期的不太一樣:

d := Dog{
        Name: "小黑",
    }

輸出的結果為:

{"Name":"小黑","Weight":0}

很明顯,狗的weight是未知,而不是0,并不是我們想要的結果,我們更想要的結果是:

{"Name":"小黑"}

為了實現(xiàn)這樣的目的,我們這時候應該使用 omitempty 選項來幫我們實現(xiàn),當我們在Dog結構體加上這個tag的時候:

type Dog struct {
    Name   string
    Weight int `json:",omitempty"`
}

此時,輸出結果為:

{"Name":"小黑"}

不能單純使用omitempty

當結構體相互嵌套的時候,那么omitempty就可能出現(xiàn)問題,比如:

type Variety struct {
?? ?Color ? ?string
?? ?Category string
}
type Dog struct {
?? ?Name ? ?string
?? ?Weight ?int ? ? `json:",omitempty"`
?? ?Variety Variety `json:",omitempty"`
}
func main() {
?? ?d := Dog{
?? ??? ?Name: "小黑",
?? ?}
?? ?marshalDog, err := json.Marshal(d)
?? ?if err != nil {
?? ??? ?fmt.Println(err.Error())
?? ?}
?? ?fmt.Println(string(marshalDog))
}

輸出結果為:

{"Name":"小黑","Variety":{"Color":"","Category":""}}

omitempty 為什么對嵌套結構體不生效呢?這是因為GO只知道簡單結構體例如int,string,pointer 這種類型的空值,不知道Variety類型的空值是什么,為了不顯示我們沒有提供值的自定義結構體,我們可以使用結構體指針:

type Dog struct {
    Name    string
    Weight  int      `json:",omitempty"`
    Variety *Variety `json:",omitempty"`
}

運行結果為:

{"Name":"小黑"}

但是如果給出下面情況的賦值:

d := Dog{
        Name:    "小黑",
        Variety: &Variety{Color: "black"},
    }

運行結果為:

{"Name":"小黑","Variety":{"Color":"black","Category":""}}

可以看到,omitempty只對*Variety生效。所以想要嵌套結構體里面的字段也能有空值省略的效果,就要在定義嵌套的結構體的時候,對里面的每個字段都要加上omitempty選項。如下所示:

type Variety struct {
    Color    string `json:",omitempty"`
    Category string `json:",omitempty"`
}

運行結果如下:

{"Name":"小黑","Variety":{"Color":"black"}}

剩下的最后一個坑就是:如果想要某個值就是為空(有實際意義),也就是說當一個空值有實際意義的時候就顯示,沒有實際意義(當時還不知道其值)的時候就不顯示,這樣的需求應該怎么做?如果還是向上面那樣,當我們需要Category為空的時候(Category:“”),最后會發(fā)現(xiàn)omitempty選項會把這個空值字段省略。正確的做法是使用指針來定義其變量。最后代碼如下:

package main
import (
?? ?"encoding/json"
?? ?"fmt"
)
type Variety struct {
?? ?Color ? ?*string `json:",omitempty"`
?? ?Category *string `json:",omitempty"`//一定要是*string類型
}
type Dog struct {
?? ?Name ? ?string
?? ?Weight ?int ? ? ?`json:",omitempty"`
?? ?Variety *Variety `json:",omitempty"`
}
func main() {
?? ?color := "black"
? ? //此處的空值有實際意義
?? ?category := ""
?? ?d := Dog{
?? ??? ?Name: ? ?"小黑",
?? ??? ?Variety: &Variety{Color: &color, Category: &category},
?? ?}
?? ?marshalDog, err := json.Marshal(d)
?? ?if err != nil {
?? ??? ?fmt.Println(err.Error())
?? ?}
?? ?fmt.Println(string(marshalDog))
}

運行結果如下:

{"Name":"小黑","Variety":{"Color":"black","Category":""}}

到此這篇關于Go語言omitempty選項的實現(xiàn)的文章就介紹到這了,更多相關Go語言omitempty選項內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言基礎學習之map的示例詳解

    Go語言基礎學習之map的示例詳解

    哈希表是常見的數(shù)據(jù)結構,有的語言會將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來聊聊Golang中map的相關知識吧
    2023-04-04
  • go語言實現(xiàn)AES加密的方法

    go語言實現(xiàn)AES加密的方法

    這篇文章主要介紹了go語言實現(xiàn)AES加密的方法,實例分析了Go語言的加密技巧,需要的朋友可以參考下
    2015-03-03
  • Hugo 游樂場內容初始化示例詳解

    Hugo 游樂場內容初始化示例詳解

    這篇文章主要為大家介紹了Hugo 游樂場內容初始化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • golang語言中for循環(huán)語句用法實例

    golang語言中for循環(huán)語句用法實例

    這篇文章主要介紹了golang語言中for循環(huán)語句用法,實例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • 簡單高效!Go語言封裝二級認證功能實現(xiàn)

    簡單高效!Go語言封裝二級認證功能實現(xiàn)

    本文將介紹如何使用Go語言封裝二級認證功能,實現(xiàn)簡單高效的用戶認證流程,二級認證是一種安全措施,要求用戶在登錄后進行額外的身份驗證,以提高賬戶安全性,
    2023-10-10
  • golang?sync.Cond同步機制運用及實現(xiàn)

    golang?sync.Cond同步機制運用及實現(xiàn)

    在?Go?里有專門為同步通信而生的?channel,所以較少看到?sync.Cond?的使用,不過它也是并發(fā)控制手段里的一種,今天我們就來認識下它的相關實現(xiàn),加深對同步機制的運用
    2023-09-09
  • 利用go-zero在Go中快速實現(xiàn)JWT認證的步驟詳解

    利用go-zero在Go中快速實現(xiàn)JWT認證的步驟詳解

    這篇文章主要介紹了如何利用go-zero在Go中快速實現(xiàn)JWT認證,本文分步驟通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • 如何通過go自定義一個分頁插件

    如何通過go自定義一個分頁插件

    分頁是我們日常開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關于如何通過go自定義一個分頁插件的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 深入探索Go語言中的高效數(shù)據(jù)結構堆

    深入探索Go語言中的高效數(shù)據(jù)結構堆

    堆,作為一種基本的數(shù)據(jù)結構,以其在優(yōu)先隊列和排序算法中提供高效解決方案的能力而聞名。在本文中,我們將深入探討堆的內部工作原理,包括其特性、實現(xiàn)細節(jié)以及在現(xiàn)代編程中的應用
    2008-06-06
  • Go語言應用閉包之返回函數(shù)

    Go語言應用閉包之返回函數(shù)

    這篇文章主要介紹了Go語言應用閉包之返回函數(shù),對于非常底層的純 Go 語言代碼或者包而言,在各個操作系統(tǒng)平臺上的可移植性是非常強的,只需要將源碼拷貝到相應平臺上進行編譯即可,或者可以使用交叉編譯來構建目標平臺的應用程序,需要的朋友可以參考下
    2023-07-07

最新評論