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

詳解Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換

 更新時(shí)間:2022年12月13日 14:07:26   作者:陳明勇  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下

前言

在日常開(kāi)發(fā)中,我們往往會(huì)將 JSON 解析成對(duì)應(yīng)的結(jié)構(gòu)體,反之也會(huì)將結(jié)構(gòu)體轉(zhuǎn)成 JSON。接下來(lái)本文會(huì)通過(guò) JSON 包的兩個(gè)函數(shù),來(lái)介紹 JSON 與結(jié)構(gòu)體之間的轉(zhuǎn)換。

結(jié)構(gòu)體轉(zhuǎn) JSON

Marshal(v any) ([]byte, error):將 v 轉(zhuǎn)成 JSON 數(shù)據(jù),以 []byte 的形式返回。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string
    Age            int
    Height         float64
    Weight         *float64
    Child          bool
    marriageStatus string
}

func main() {
    weight := 120.5
    user := User{
        Name:           "gopher",
        Age:            18,
        Height:         180.5,
        Weight:         &weight,
        Child:          false,
        marriageStatus: "未婚",
    }
    jsonBytes, err := json.Marshal(user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Println(string(jsonBytes)) // {"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
}

執(zhí)行結(jié)果:

{"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}

根據(jù)結(jié)果可知:

  • 不可導(dǎo)出字段(字段名以小寫(xiě)字母開(kāi)頭),是不能被轉(zhuǎn)成 JSONkey 的,這也符合 Go 的語(yǔ)法規(guī)定,以小寫(xiě)字母開(kāi)頭的變量或結(jié)構(gòu)體字段等,不能在包外被訪(fǎng)問(wèn)。
  • 轉(zhuǎn)換后的字段名,與結(jié)構(gòu)體字段的名字一樣。
  • 如果字段是指針類(lèi)型,轉(zhuǎn)換后的值為指針指向的字段值。

如果我們想要指定字段轉(zhuǎn)換之后的命名,或者將一個(gè)可導(dǎo)出的字段進(jìn)行忽略,可以通過(guò)給結(jié)構(gòu)體字段打上 JSON 標(biāo)簽的方式實(shí)現(xiàn)。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string   `json:"name"`
    Age            int      `json:"age"`
    Height         float64  `json:"height"`
    Weight         *float64 `json:"weight"`
    Child          bool     `json:"child"`
    MarriageStatus string   `json:"-"`
}

func main() {
    weight := 120.5
    user := User{
        Name:           "gopher",
        Age:            18,
        Height:         180.5,
        Weight:         &weight,
        Child:          false,
        MarriageStatus: "未婚",
    }
    jsonBytes, err := json.Marshal(user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Println(string(jsonBytes)) // {"name":"gopher","age":18,"height":180.5,"weight":120.5,"child":false}
}

通過(guò)給結(jié)構(gòu)體字段定打上 JSON 標(biāo)簽,可指定轉(zhuǎn)成 JSON 后的字段名,如果 JSON 標(biāo)簽的值為 -,則在轉(zhuǎn)換 JSON 時(shí)忽略此字段。

JSON 解析結(jié)構(gòu)體

Unmarshal(data []byte, v any) error:將 JSON 解析成指定的結(jié)構(gòu)體。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string  `json:"name"`
    Age            int     `json:"age"`
    Height         float64 `json:"height"`
    Child          bool    `json:"-"`
    marriageStatus string
}

func main() {
    userStr := `
    {
      "name": "gopher",
      "age": 18,
      "height": 180.5,
      "child": true,
      "marriageStatus": "未婚"
    }
    `
    user := &User{}
    err := json.Unmarshal([]byte(userStr), &user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Printf("%#v", user) // &main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
}

執(zhí)行結(jié)果:

&main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}

根據(jù)結(jié)果可知:

使用Unmarshal函數(shù)時(shí),我們需要傳入結(jié)構(gòu)體的指針類(lèi)型,否則結(jié)構(gòu)體字段的值將不會(huì)被改變,因?yàn)榈讓邮峭ㄟ^(guò)指針去修改結(jié)構(gòu)體字段的值。

JSON 解析時(shí),JSONkey 與結(jié)構(gòu)體字段的匹配規(guī)則是:

  • 優(yōu)先查找 JSON 標(biāo)簽值和 key 一樣的,找到則將 value 賦值給對(duì)應(yīng)字段。
  • 如果沒(méi)有 JSON 標(biāo)簽值與 key 相匹配,則根據(jù)字段名進(jìn)行匹配。

可以發(fā)現(xiàn),如果結(jié)構(gòu)體字段是非導(dǎo)出字段或 JSON 標(biāo)簽的值為 -,將不會(huì)被匹配到。

小結(jié)

本文介紹了 Go 語(yǔ)言里,JSON 與結(jié)構(gòu)體之間的轉(zhuǎn)換。在結(jié)構(gòu)體轉(zhuǎn) JSON 時(shí),我們可以通過(guò)給字段打標(biāo)簽,指定轉(zhuǎn)換后的 key 命名,需要注意的是,如果結(jié)構(gòu)體的字段為非導(dǎo)出字段或字段的 JSON 標(biāo)簽值為 -,在轉(zhuǎn)換 JSON 時(shí),將會(huì)被忽略。反之 JSON 解析結(jié)構(gòu)體時(shí)也是一樣的。

到此這篇關(guān)于詳解Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Go語(yǔ)言結(jié)構(gòu)體 JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLang?Time時(shí)間操作函數(shù)講解

    GoLang?Time時(shí)間操作函數(shù)講解

    在日常開(kāi)發(fā)中,我們避免不了時(shí)間的使用,我們可能需要獲取當(dāng)前時(shí)間,然后格式化保存,也可能需要在時(shí)間類(lèi)型與字符串類(lèi)型之間相互轉(zhuǎn)換等。本文將會(huì)對(duì)?Go?time?包里面的常用函數(shù)和方法進(jìn)行介紹,需要的可以參考一下
    2023-01-01
  • 從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    在?Go?語(yǔ)言中,map?是一種非常常見(jiàn)的數(shù)據(jù)類(lèi)型,它可以用于快速地檢索數(shù)據(jù)。本篇文章將介紹?Go?語(yǔ)言中的?map,包括?map?的定義、初始化、操作和優(yōu)化,需要的可以參考一下
    2023-04-04
  • go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法

    go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法

    本文主要介紹了go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • go語(yǔ)言中struct標(biāo)簽詳解

    go語(yǔ)言中struct標(biāo)簽詳解

    這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中struct標(biāo)簽的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用go語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-07-07
  • go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    本文主要介紹了go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang 進(jìn)度條功能實(shí)現(xiàn)示例

    golang 進(jìn)度條功能實(shí)現(xiàn)示例

    這篇文章主要介紹了golang 進(jìn)度條功能實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    構(gòu)造器一般面向?qū)ο笳Z(yǔ)言的典型特性,用于初始化變量。Go語(yǔ)言沒(méi)有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類(lèi)型構(gòu)造器的差異及其應(yīng)用場(chǎng)景
    2023-01-01
  • 淺析Go語(yǔ)言中的Range關(guān)鍵字

    淺析Go語(yǔ)言中的Range關(guān)鍵字

    Range是go語(yǔ)言中很獨(dú)特的一個(gè)關(guān)鍵詞,也相當(dāng)好用。下面就跟著小編來(lái)再聊聊這個(gè)Range關(guān)鍵字,有需要的朋友們可以參考借鑒。
    2016-09-09
  • 全面解析Go語(yǔ)言中crypto/sha1庫(kù)

    全面解析Go語(yǔ)言中crypto/sha1庫(kù)

    crypto/sha1在Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中是一個(gè)強(qiáng)大且實(shí)用的工具,適用于多種應(yīng)用場(chǎng)景,本文就詳細(xì)的介紹了Go語(yǔ)言中crypto/sha1庫(kù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Go中的交叉編譯問(wèn)題

    Go中的交叉編譯問(wèn)題

    這篇文章主要介紹了Go中的交叉編譯問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論

皮山县| 浦东新区| 房产| 安国市| 肇东市| 九江市| 固阳县| 徐水县| 辽中县| 隆安县| 阳新县| 博罗县| 台南市| 湖北省| 和政县| 隆昌县| 溧水县| 定结县| 赞皇县| 绥芬河市| 沁阳市| 香格里拉县| 行唐县| 察雅县| 安远县| 兴海县| 天水市| 禄丰县| 高尔夫| 洪湖市| 江城| 金昌市| 海晏县| 囊谦县| 江门市| 沾益县| 若羌县| 枝江市| 麻栗坡县| 郑州市| 深州市|