91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中omitempty關鍵字怎么用

發布時間:2022-01-17 12:03:12 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

本篇內容介紹了“Golang中omitempty關鍵字怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

用法

熟悉 Golang 的朋友對于 json 和 struct 之間的轉換一定不陌生,為了將代碼中的結構體與 json 數據解耦,通常我們會在結構體的 field 類型后加上解釋說明,例如在表示一個地址的時候, json 數據如下所示

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

與之相對應的 Golang 結構體表示可能是這個樣子的

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

這樣無論代碼中的變量如何改變,我們都能成功將 json 數據解析出來,獲得正確的街道,城市等信息,到目前為止一切正常。但如果我們想要將地址結構體恢復成 json 格式時,問題就來了。比方說我們用下面這段代碼讀取了地址 json ,然后根據業務邏輯處理了之后恢復成正常的 json 打印出來

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 數據中是沒有的(在美國的地址中,如果不是群租公寓或者共享辦公樓, suite 這一條不存在很正常,人們直接用街道門牌號來表示地址就足夠了),但我們更希望的是,在一個地址有 suite 號碼的時候輸出,不存在 suite 的時候就不輸出,幸運的是,我們可以在 Golang 的結構體定義中添加 omitempty 關鍵字,來表示這條信息如果沒有提供,在序列化成 json 的時候就不要包含其默認值。稍作修改,地址結構體就變成了

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

重新運行,即可得到正確的結果。

陷阱

帶來方便的同時,使用 omitempty 也有些小陷阱,一個是該關鍵字無法忽略掉嵌套結構體。還是拿地址類型說事,這回我們想要往地址結構體中加一個新 field 來表示經緯度,如果沒有缺乏相關的數據,暫時可以忽略。新的 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"`
}

讀入原來的地址數據,處理后序列化輸出,我們就會發現即使加上了 omitempty 關鍵字,輸出的 json 還是帶上了一個空的坐標信息

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

為了達到我們想要的效果,可以把坐標定義為指針類型,這樣 Golang 就能知道一個指針的“空值”是多少了,否則面對一個我們自定義的結構, Golang 是猜不出我們想要的空值的。于是有了如下的結構體定義

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"`
}

相應的輸出為

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

另一個“陷阱”是,對于用 omitempty 定義的 field ,如果給它賦的值恰好等于默認空值的話,在轉為 json 之后也不會輸出這個 field 。比如說上面定義的經緯度坐標結構體,如果我們將經緯度兩個 field 都加上 omitempty

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

然后我們對非洲幾內亞灣的“原點坐標”非常感興趣,于是編寫了如下代碼

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))
}

最終我們得到了一個

{}

這個坐標消失不見了!但我們的設想是,如果一個地點沒有經緯度信息,則懸空,這沒有問題,但對于“原點坐標”,我們在確切知道它的經緯度的情況下,(0.0, 0.0)仍然被忽略了。正確的寫法也是將結構體內的定義改為指針

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

這樣空值就從 float64 的 0.0 變為了指針類型的 nil ,我們就能看到正確的經緯度輸出。

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

“Golang中omitempty關鍵字怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太保市| 来宾市| 儋州市| 桂林市| 鸡西市| 襄樊市| 水城县| 宜宾市| 彭山县| 新河县| 侯马市| 句容市| 石景山区| 阿瓦提县| 威宁| 临澧县| 嵊州市| 新疆| 赣榆县| 滦南县| 镇安县| 时尚| 建阳市| 蕲春县| 富民县| 民丰县| 衢州市| 浙江省| 泗洪县| 青浦区| 双鸭山市| 禹州市| 济南市| 桑植县| 新余市| 民权县| 常熟市| 西城区| 水城县| 方城县| 宁河县|