最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn)

 更新時(shí)間:2022年01月17日 10:17:46   作者:Old_Panda  
本文主要介紹了Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

用法

熟悉 Golang 的朋友對(duì)于 json 和 struct 之間的轉(zhuǎn)換一定不陌生,為了將代碼中的結(jié)構(gòu)體與 json 數(shù)據(jù)解耦,通常我們會(huì)在結(jié)構(gòu)體的 field 類型后加上解釋說(shuō)明,例如在表示一個(gè)地址的時(shí)候, json 數(shù)據(jù)如下所示

{
    "street": "200 Larkin St",
    "city": "San Francisco",
    "state": "CA",
    "zipcode": "94102"
}

與之相對(duì)應(yīng)的 Golang 結(jié)構(gòu)體表示可能是這個(gè)樣子的

type address struct {
    Street  string `json:"street"`  // 街道
    Ste     string `json:"suite"`   // 單元(可以不存在)
    City    string `json:"city"`    // 城市
    State   string `json:"state"`   // 州/省
    Zipcode string `json:"zipcode"` // 郵編
}

這樣無(wú)論代碼中的變量如何改變,我們都能成功將 json 數(shù)據(jù)解析出來(lái),獲得正確的街道,城市等信息,到目前為止一切正常。但如果我們想要將地址結(jié)構(gòu)體恢復(fù)成 json 格式時(shí),問(wèn)題就來(lái)了。比方說(shuō)我們用下面這段代碼讀取了地址 json ,然后根據(jù)業(yè)務(wù)邏輯處理了之后恢復(fù)成正常的 json 打印出來(lái)

func main() {
? ? ? ? data := `{
? ? ? ? "street": "200 Larkin St",
? ? ? ? "city": "San Francisco",
? ? ? ? "state": "CA",
? ? ? ? "zipcode": "94102"
? ? }`
? ? addr := new(address)
? ? json.Unmarshal([]byte(data), &addr)

? ? ? ? // 處理了一番 addr 變量...

? ? addressBytes, _ := json.MarshalIndent(addr, "", " ? ?")
? ? fmt.Printf("%s\n", string(addressBytes))
}

這段代碼的輸出是

{
    "street": "200 Larkin St",
    "suite": "",
    "city": "San Francisco",
    "state": "CA",
    "zipcode": "94102"
}

多了一行 "suite": "", ,而這則信息在原本的 json 數(shù)據(jù)中是沒有的(在美國(guó)的地址中,如果不是群租公寓或者共享辦公樓, suite 這一條不存在很正常,人們直接用街道門牌號(hào)來(lái)表示地址就足夠了),但我們更希望的是,在一個(gè)地址有 suite 號(hào)碼的時(shí)候輸出,不存在 suite 的時(shí)候就不輸出,幸運(yùn)的是,我們可以在 Golang 的結(jié)構(gòu)體定義中添加 omitempty 關(guān)鍵字,來(lái)表示這條信息如果沒有提供,在序列化成 json 的時(shí)候就不要包含其默認(rèn)值。稍作修改,地址結(jié)構(gòu)體就變成了

type address struct {
    Street  string `json:"street"`
    Ste     string `json:"suite,omitempty"`
    City    string `json:"city"`
    State   string `json:"state"`
    Zipcode string `json:"zipcode"`
}

重新運(yùn)行,即可得到正確的結(jié)果。

陷阱

帶來(lái)方便的同時(shí),使用 omitempty 也有些小陷阱,一個(gè)是該關(guān)鍵字無(wú)法忽略掉嵌套結(jié)構(gòu)體。還是拿地址類型說(shuō)事,這回我們想要往地址結(jié)構(gòu)體中加一個(gè)新 field 來(lái)表示經(jīng)緯度,如果沒有缺乏相關(guān)的數(shù)據(jù),暫時(shí)可以忽略。新的 struct 定義如下所示

type address struct {
? ? Street ? ? string ? ? `json:"street"`
? ? Ste ? ? ? ?string ? ? `json:"suite,omitempty"`
? ? City ? ? ? string ? ? `json:"city"`
? ? State ? ? ?string ? ? `json:"state"`
? ? Zipcode ? ?string ? ? `json:"zipcode"`
? ? Coordinate coordinate `json:"coordinate,omitempty"`
}

type coordinate struct {
? ? Lat float64 `json:"latitude"`
? ? Lng float64 `json:"longitude"`
}

讀入原來(lái)的地址數(shù)據(jù),處理后序列化輸出,我們就會(huì)發(fā)現(xiàn)即使加上了 omitempty 關(guān)鍵字,輸出的 json 還是帶上了一個(gè)空的坐標(biāo)信息

{
    "street": "200 Larkin St",
    "city": "San Francisco",
    "state": "CA",
    "zipcode": "94102",
    "coordinate": {
        "latitude": 0,
        "longitude": 0
    }
}

為了達(dá)到我們想要的效果,可以把坐標(biāo)定義為指針類型,這樣 Golang 就能知道一個(gè)指針的“空值”是多少了,否則面對(duì)一個(gè)我們自定義的結(jié)構(gòu), Golang 是猜不出我們想要的空值的。于是有了如下的結(jié)構(gòu)體定義

type address struct {
? ? Street ? ? string ? ? ?`json:"street"`
? ? Ste ? ? ? ?string ? ? ?`json:"suite,omitempty"`
? ? City ? ? ? string ? ? ?`json:"city"`
? ? State ? ? ?string ? ? ?`json:"state"`
? ? Zipcode ? ?string ? ? ?`json:"zipcode"`
? ? Coordinate *coordinate `json:"coordinate,omitempty"`
}

type coordinate struct {
? ? Lat float64 `json:"latitude"`
? ? Lng float64 `json:"longitude"`
}

相應(yīng)的輸出為

{
    "street": "200 Larkin St",
    "city": "San Francisco",
    "state": "CA",
    "zipcode": "94102"
}

另一個(gè)“陷阱”是,對(duì)于用 omitempty 定義的 field ,如果給它賦的值恰好等于默認(rèn)空值的話,在轉(zhuǎn)為 json 之后也不會(huì)輸出這個(gè) field 。比如說(shuō)上面定義的經(jīng)緯度坐標(biāo)結(jié)構(gòu)體,如果我們將經(jīng)緯度兩個(gè) field 都加上 omitempty

type coordinate struct {
    Lat float64 `json:"latitude,omitempty"`
    Lng float64 `json:"longitude,omitempty"`
}

然后我們對(duì)非洲幾內(nèi)亞灣的“原點(diǎn)坐標(biāo)”非常感興趣,于是編寫了如下代碼

func main() {
? ? cData := `{
? ? ? ? "latitude": 0.0,
? ? ? ? "longitude": 0.0
? ? }`
? ? c := new(coordinate)
? ? json.Unmarshal([]byte(cData), &c)

? ? ? ? // 具體處理邏輯...

? ? coordinateBytes, _ := json.MarshalIndent(c, "", " ? ?")
? ? fmt.Printf("%s\n", string(coordinateBytes))
}

最終我們得到了一個(gè)

{}

這個(gè)坐標(biāo)消失不見了!但我們的設(shè)想是,如果一個(gè)地點(diǎn)沒有經(jīng)緯度信息,則懸空,這沒有問(wèn)題,但對(duì)于“原點(diǎn)坐標(biāo)”,我們?cè)诖_切知道它的經(jīng)緯度的情況下,(0.0, 0.0)仍然被忽略了。正確的寫法也是將結(jié)構(gòu)體內(nèi)的定義改為指針

type coordinate struct {
? ? Lat *float64 `json:"latitude,omitempty"`
? ? Lng *float64 `json:"longitude,omitempty"`
}

這樣空值就從 float64 的 0.0 變?yōu)榱酥羔橆愋偷?nil ,我們就能看到正確的經(jīng)緯度輸出。

{
    "latitude": 0,
    "longitude": 0
}

P.S. 本文中拿來(lái)作示例的地址是舊金山亞洲藝術(shù)博物館的地址,藏品豐富,上到夏商周,下至明清的文物都能看到,幾年前第一次去參觀,很是喜歡,印象深刻。

到此這篇關(guān)于Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang omitempty 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言中布隆過(guò)濾器低空間成本判斷元素是否存在方式

    go語(yǔ)言中布隆過(guò)濾器低空間成本判斷元素是否存在方式

    這篇文章主要為大家介紹了go語(yǔ)言中布隆過(guò)濾器低空間成本判斷元素是否存在方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 使用Go Validator有效驗(yàn)證數(shù)據(jù)示例分析

    使用Go Validator有效驗(yàn)證數(shù)據(jù)示例分析

    作為一名開發(fā)者,確保Go應(yīng)用中處理的數(shù)據(jù)是有效和準(zhǔn)確的非常重要,Go Validator是一個(gè)開源的數(shù)據(jù)驗(yàn)證庫(kù),為Go結(jié)構(gòu)體提供強(qiáng)大且易于使用的數(shù)據(jù)驗(yàn)證功能,本篇文章將介紹Go Validator庫(kù)的主要特點(diǎn)以及如何在Go應(yīng)用中使用它來(lái)有效驗(yàn)證數(shù)據(jù)
    2023-12-12
  • Golang實(shí)現(xiàn)按比例切分流量的示例詳解

    Golang實(shí)現(xiàn)按比例切分流量的示例詳解

    我們?cè)谶M(jìn)行灰度發(fā)布時(shí),往往需要轉(zhuǎn)發(fā)一部分流量到新上線的服務(wù)上,進(jìn)行小規(guī)模的驗(yàn)證,隨著功能的不斷完善,我們也會(huì)逐漸增加轉(zhuǎn)發(fā)的流量,這就需要按比例去切分流量,那么如何實(shí)現(xiàn)流量切分呢,接下來(lái)小編就給大家詳細(xì)的介紹一下實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-09-09
  • Golang 在gin框架中如何使用JWT鑒權(quán)

    Golang 在gin框架中如何使用JWT鑒權(quán)

    JWT,全稱 JSON Web Token,是一種開放標(biāo)準(zhǔn)(RFC 7519),用于安全地在雙方之間傳遞信息,這篇文章主要介紹了golang 在Gin框架中使用JWT鑒權(quán),需要的朋友可以參考下
    2024-07-07
  • 如何用Go判斷元素是否在切片中

    如何用Go判斷元素是否在切片中

    切片(Slice)是一個(gè)擁有相同類型元素的可變長(zhǎng)度的序列,下面這篇文章主要給大家介紹了關(guān)于如何用Go判斷元素是否在切片中的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Go語(yǔ)言之fo循環(huán)與條件判斷

    Go語(yǔ)言之fo循環(huán)與條件判斷

    這篇文章主要介紹Go語(yǔ)言之fo循環(huán)與條件判斷,for 循環(huán)是一個(gè)循環(huán)控制結(jié)構(gòu),可以執(zhí)行指定次數(shù)的循環(huán)。下面文章我們結(jié)合條件判斷,感興趣的朋友可以參考一下
    2021-10-10
  • 優(yōu)雅管理Go?Project生命周期

    優(yōu)雅管理Go?Project生命周期

    這篇文章主要為大家介紹了如何優(yōu)雅的管理Go?Project生命周期,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Go語(yǔ)言編程中字符串切割方法小結(jié)

    Go語(yǔ)言編程中字符串切割方法小結(jié)

    這篇文章主要介紹了Go語(yǔ)言編程中字符串切割方法小結(jié),所整理的方法都來(lái)自字符串相關(guān)的strings包,需要的朋友可以參考下
    2015-10-10
  • Go素?cái)?shù)篩選分析詳解

    Go素?cái)?shù)篩選分析詳解

    學(xué)習(xí)Go語(yǔ)言的過(guò)程中,遇到素?cái)?shù)篩選的問(wèn)題。這是一個(gè)經(jīng)典的并發(fā)編程問(wèn)題,是某大佬的代碼,短短幾行代碼就實(shí)現(xiàn)了素?cái)?shù)篩選,這篇文章主要介紹了Go素?cái)?shù)篩選分析,需要的朋友可以參考下
    2022-10-10
  • Go語(yǔ)言七篇入門教程一簡(jiǎn)介初識(shí)

    Go語(yǔ)言七篇入門教程一簡(jiǎn)介初識(shí)

    本篇是Go語(yǔ)言七篇入門系列第一篇Go語(yǔ)言初識(shí)及簡(jiǎn)單介紹,從現(xiàn)在開始一起打開Go語(yǔ)言的學(xué)習(xí)大門吧,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11

最新評(píng)論

泌阳县| 涿鹿县| 桑日县| 牙克石市| 同仁县| 祁连县| 旺苍县| 英德市| 常德市| 西青区| 伊宁县| 磐安县| 乌苏市| 航空| 广东省| 成安县| 兴仁县| 龙江县| 禄丰县| 道真| 静海县| 赤水市| 宽甸| 务川| 浙江省| 山丹县| 耿马| 西和县| 太康县| 罗源县| 永春县| 土默特左旗| 甘南县| 新闻| 汶川县| 桐庐县| 安龙县| 肃南| 肃宁县| 岳池县| 密山市|