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

Golang JSON的進(jìn)階用法實(shí)例講解

 更新時間:2018年09月26日 10:49:55   作者:yulibaozi  
這篇文章主要給大家介紹了關(guān)于Golang JSON進(jìn)階用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

痛點(diǎn)

json 是當(dāng)前最常用的數(shù)據(jù)傳輸格式之一,純文本,容易使用,方便閱讀,在通信過程中大量被使用。 

你是否遇到過json中某個字段填入某種類型都適合而陷入兩難境地? (例如:定義了一個port字段,你卻不知道是填入 8080 ,還是 “8080” 的尷尬局面)

你是否遇到過json反解析報錯是因為填入字段的類型不匹配導(dǎo)致的?例如:

json: cannot unmarshal number into Go struct field Host.port of type string

你是否有json某字段兼容2種或者多種的數(shù)據(jù)結(jié)構(gòu)的需求?

你是否想讓程序更優(yōu)雅,更具有適配性,而不在被這些小細(xì)節(jié)頭痛?

如果你有或者你想,獲取你可以看看這篇文章。

重現(xiàn)問題

我們給了用戶一個json如下:

{
 "name":"yulibaozi",
 "port":8080
}

但是,業(yè)務(wù)方卻誤填了”8080”,結(jié)果我們程序反解析報錯,導(dǎo)致業(yè)務(wù)失敗。

json: cannot unmarshal number into Go struct field Host.port of type string

或許你認(rèn)為這是業(yè)務(wù)方的問題,但我認(rèn)為我們可以更優(yōu)雅的解決這個問題。

如何解決問題

我們先定義了一個結(jié)構(gòu)體

type Host struct {
 Name string `json:"name"`
 Port Port `json:"port"`
}

心細(xì)的你會發(fā)現(xiàn),Port既不是int也不是string類型,而是Port類型,而Port類型是:

type Type int

const (
 Int Type = iota
 String
)

type Port struct {
 Type Type
 IntVal int
 StrVal string
}

在Port結(jié)構(gòu)體中,我們發(fā)現(xiàn)了Type類型, 而Type類型包括了int,string兩種類型。接下來就非常重要了,我們需要實(shí)現(xiàn)以下這兩個接口。

json.Unmarshaller interface
json.Marshaller interface

實(shí)現(xiàn)代碼如下:

type Port struct {
 Type Type
 IntVal int
 StrVal string
}

// 實(shí)現(xiàn) json.Unmarshaller 接口
func (port *Port) UnmarshalJSON(value []byte) error {
 if value[0] == '"' {
  port.Type = String
  return json.Unmarshal(value, &port.StrVal)
 }
 port.Type = Int
 return json.Unmarshal(value, &port.IntVal)
}

// 實(shí)現(xiàn) json.Marshaller 接口
func (port Port) MarshalJSON() ([]byte, error) {
 switch port.Type {
 case Int:
  return json.Marshal(port.IntVal)
 case String:
  return json.Marshal(port.StrVal)
 default:
  return []byte{}, fmt.Errorf("impossible Port.Type")
 }
}

接下來測試:

測試反解析

測試反解析int

給出json數(shù)據(jù):

{"name":"yulibaozi","port":8090}

反解析得到的結(jié)構(gòu)體數(shù)據(jù)如下:

&{Name:yulibaozi Port:{Type:0 IntVal:8090 StrVal:}}

測試反解析string:

給出json數(shù)據(jù):

{"name":"yulibaozi","port":"8090"}

反解析得到的結(jié)構(gòu)體數(shù)據(jù)如下:

&{Name:yulibaozi Port:{Type:1 IntVal:0 StrVal:8090}}

測試編碼的json

測試編碼int的結(jié)構(gòu)體如下:

host := &Host{
   Name: "yulibaozi",
   Port: Port{
     Type:  Int,
     IntVal: 8080,
   },
 }

編碼后的json如下:

{"name":"yulibaozi","port":8080}

測試編碼string的結(jié)構(gòu)體如下:

host := &Host{
   Name: "yulibaozi",
   Port: Port{
     Type:  String,
     StrVal: "8080",
   },
 }

編碼后的json數(shù)據(jù)如下:

{"name":"yulibaozi","port":"8080"}

在反編碼測試中,你會發(fā)現(xiàn)當(dāng)json填入的類型不同時,會編碼到結(jié)構(gòu)體中對應(yīng)的字段中。

在編碼測試中, 具體編碼那個數(shù)據(jù)是由Type來確定的。

總結(jié)

其實(shí),這篇文章只是分享了下json中使用的小技巧,他打破了在使用json時,需要呆板的數(shù)據(jù)結(jié)構(gòu)的印象,轉(zhuǎn)而走向了多變,靈活跳脫的風(fēng)格,其實(shí),這這個小tips的核心在于實(shí)現(xiàn)Unmarshaller,Marshaller這兩個結(jié)構(gòu)體,他們的實(shí)現(xiàn)是這個分享的關(guān)鍵,當(dāng)然,你可以實(shí)現(xiàn)如開篇所說的那樣,json某字段兼容2種及以上結(jié)構(gòu),當(dāng)然,你也可以對yaml,toml等進(jìn)行折騰,都會得到你想要的答案。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開發(fā)

    掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開發(fā)

    這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實(shí)現(xiàn)中間件的藝術(shù)
    2024-01-01
  • 一文教你學(xué)會Go中singleflight的使用

    一文教你學(xué)會Go中singleflight的使用

    緩存在項目中使用應(yīng)該是非常頻繁的,提到緩存只要了解過?singleflight?,基本都會用于緩存實(shí)現(xiàn)的一部分吧,下面就跟隨小編一起來學(xué)習(xí)一下singleflight的使用吧
    2024-02-02
  • 一文了解Go語言io.Copy函數(shù)

    一文了解Go語言io.Copy函數(shù)

    這篇文章主要為大家介紹了Go語言io.Copy函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Go使用MongoDB的操作指南(增刪改查)

    Go使用MongoDB的操作指南(增刪改查)

    MongoDB 是一種高性能、開源、文檔型的 NoSQL 數(shù)據(jù)庫,廣泛應(yīng)用于 Web 應(yīng)用、大數(shù)據(jù)以及云計算領(lǐng)域,Go 語言則以其快速、開發(fā)效率高、代碼可維護(hù)性強(qiáng)著稱,本指南將詳細(xì)介紹如何在 Go 語言中使用 MongoDB 進(jìn)行數(shù)據(jù)庫操作,需要的朋友可以參考下
    2024-08-08
  • Golang之模糊測試工具的使用

    Golang之模糊測試工具的使用

    本文主要介紹了Golang之模糊測試工具的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法

    Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法

    這篇文章主要介紹了Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)

    goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)

    本文主要介紹了goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • GScript?編寫標(biāo)準(zhǔn)庫示例詳解

    GScript?編寫標(biāo)準(zhǔn)庫示例詳解

    這篇文章主要為大家介紹了GScript?編寫標(biāo)準(zhǔn)庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go語言建議多使用切片少使用數(shù)組原理探究

    Go語言建議多使用切片少使用數(shù)組原理探究

    這篇文章主要為大家介紹了Go語言建議多使用切片少使用數(shù)組原理探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)基本操作詳解

    go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)基本操作詳解

    這篇文章主要為大家介紹了go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)基本操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論

台北县| 昌乐县| 汶上县| 凌海市| 双桥区| 木兰县| 沂南县| 布拖县| 乌兰县| 吴江市| 乳山市| 凤城市| 久治县| 石河子市| 栖霞市| 营口市| 体育| 怀柔区| 会东县| 永泰县| 东山县| 乐清市| 石狮市| 时尚| 宜城市| 通海县| 六盘水市| 丹棱县| 栖霞市| 视频| 巴青县| 饶阳县| 韩城市| 阳东县| 京山县| 温宿县| 芦山县| 图木舒克市| 新田县| 盘山县| 孝感市|