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

Golang JSON的進階用法實例講解

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

痛點

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

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

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

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

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

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

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

重現(xiàn)問題

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

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

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

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

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

如何解決問題

我們先定義了一個結構體

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

心細的你會發(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結構體中,我們發(fā)現(xiàn)了Type類型, 而Type類型包括了int,string兩種類型。接下來就非常重要了,我們需要實現(xiàn)以下這兩個接口。

json.Unmarshaller interface
json.Marshaller interface

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

type Port struct {
 Type Type
 IntVal int
 StrVal string
}

// 實現(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)
}

// 實現(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}

反解析得到的結構體數(shù)據(jù)如下:

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

測試反解析string:

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

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

反解析得到的結構體數(shù)據(jù)如下:

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

測試編碼的json

測試編碼int的結構體如下:

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

編碼后的json如下:

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

測試編碼string的結構體如下:

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

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

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

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

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

總結

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

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

相關文章

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

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

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

    一文教你學會Go中singleflight的使用

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

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

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

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

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

    Golang之模糊測試工具的使用

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

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

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

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

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

    GScript?編寫標準庫示例詳解

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

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

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

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

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

最新評論

泗水县| 秦皇岛市| 全州县| 洪江市| 尼勒克县| 宾阳县| 陵水| 万年县| 平乡县| 阿鲁科尔沁旗| 东至县| 山东省| 龙门县| 陆川县| 齐河县| 沂源县| 张家界市| 会泽县| 大关县| 红原县| 普格县| 赤壁市| 饶河县| 平遥县| 营山县| 宁阳县| 宽甸| 视频| 施甸县| 徐州市| 江口县| 龙岩市| 临西县| 广宁县| 黑山县| 安陆市| 新河县| 云和县| 九寨沟县| 崇礼县| 荣成市|