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

淺析Go中序列化與反序列化的基本使用

 更新時(shí)間:2023年04月17日 16:47:46   作者:陪我去看海  
序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫(kù)或文件的過(guò)程,反向過(guò)程稱(chēng)為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下

什么是序列化與反序列化

這里引入微軟對(duì)序列化的解釋?zhuān)?/p>

序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫(kù)或文件的過(guò)程。 它的主要用途是保存對(duì)象的狀態(tài),以便能夠在需要時(shí)重新創(chuàng)建對(duì)象。 反向過(guò)程稱(chēng)為“反序列化”。

序列化工作原理

將對(duì)象序列化為帶有數(shù)據(jù)的流。可以將此流中的對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù),文件或者內(nèi)存中。

在Go中如何序列化一個(gè)對(duì)象

首先 go 給我提供了便捷的 xml序列化的 API,直接使用即可,我們來(lái)看看效果

package main
?
import (
    "encoding/xml"
    "fmt"
)
?
type person struct {
    Name string
    Age  int
}
?
func main() {
    p1 := person{"pkc", 22}
    // xml 序列化
    if data, err := xml.Marshal(p1); err != nil{
        fmt.Println(err)
        return
    } else {
        fmt.Println(data)
        // 將 byte 轉(zhuǎn)為 string
        fmt.Println(string(data))
    }
}

這里我們初始化了一個(gè) struct 對(duì)象,將 struct 實(shí)例化為 p1,然后使用了 Go 給我們提供的序列化API xml.Marshal,該API是返回兩個(gè)值 ([]byte, error),將結(jié)果進(jìn)行字符串類(lèi)型轉(zhuǎn)換后,可以得到結(jié)果,是不是看起來(lái)很熟悉的感覺(jué)呢,就像是標(biāo)簽和標(biāo)簽包裹的內(nèi)容。

最后的結(jié)果:

[60 112 101 114 115 111 110 62 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 60 65 103 101 62 50 50 60 47 65 103 101 62 60 47 112 101 114 115 111 110 62]   
<person><Name>pkc</Name><Age>22</Age></person>

這時(shí)候看他,一行顯示完,好像不具備可讀性。

如何格式化序列化后的數(shù)據(jù)

這時(shí)候 Go 也給我們提供了另一個(gè)API,MarshalIndent,該API接收三個(gè)參數(shù),分別是,(要序列化的對(duì)象,每行的前綴,縮進(jìn)字符)

// 將 
xml.Marshal(p1)
// 修改為
xml.MarshalIndent(p1, "", " ")

得到結(jié)果:

[60 112 101 114 115 111 110 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]
<person>
        <Name>pkc</Name>
        <Age>22</Age>
</person>

這時(shí)候我們得到了一個(gè) xml結(jié)構(gòu),但是標(biāo)簽一般都會(huì)加上屬性,這時(shí)候想,如何給標(biāo)簽?zāi)芗由蠈傩阅?/p>

如何給序列化后的xml加上屬性

假設(shè):我們要給 Person 標(biāo)簽添加屬性 class,我們應(yīng)該如何做

將代碼修改后:

package main
?
import (
    "encoding/xml"
    "fmt"
)
?
// `xml:"xxx,attr"`,xxx 是自定義屬性,如果不填,那屬性名就是鍵名:Class
type person struct {
    Class string `xml:"class,attr"`
    Name string
    Age  int
}
?
func main() {
    p1 := person{"container", "pkc", 22}
    // xml 序列化
    if data, err := xml.MarshalIndent(p1, "", " "); err != nil{
        fmt.Println(err)
        return
    } else {
        fmt.Println(data)
        // 將 byte 轉(zhuǎn)為 string
        fmt.Println(string(data))
    }
}

這里使用了Go中struct中的field tag語(yǔ)法 是聲明類(lèi)型之后的注解,這樣就成功給標(biāo)簽添加上屬性以及值了

結(jié)果:

[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]        
<person class="container">
        <Name>pkc</Name>
        <Age>22</Age>
</person>

如何將xml反序列化為一個(gè)對(duì)象

說(shuō)完了序列化,那么我們拿著序列化之后的數(shù)據(jù),如何反序列化變成我們想要的結(jié)構(gòu)呢

這里Go也是提供了API,Unmarshal,該API接收兩個(gè)參數(shù),第一個(gè)([]byte,接收反序列化后的對(duì)象),代碼修改后

package main
?
import (
    "encoding/xml"
    "fmt"
)
?
type person struct {
    Class string `xml:"class,attr"`
    Name string
    Age  int
}
?
func main() {
    var data []byte
    var err error
?
    p1 := person{"container", "pkc", 22}
    // xml 序列化
    if data, err = xml.MarshalIndent(p1, "", "  "); err != nil{
        fmt.Println(err)
        return
    }
    fmt.Println(data)
    // 將 byte 轉(zhuǎn)為 string
    fmt.Println(string(data))
    fmt.Println()
?
    // 創(chuàng)建示例接收反序列化的對(duì)象
    p2 := new(person)
    if err = xml.Unmarshal(data, p2); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("反序列化后:%v", p2)
}

結(jié)果:

[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]        
<person class="container">
        <Name>pkc</Name>
        <Age>22</Age>
</person>
?
反序列化后:&{container pkc 22}

到此這篇關(guān)于淺析Go中序列化與反序列化的基本使用的文章就介紹到這了,更多相關(guān)Go序列化 反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLang內(nèi)存模型詳細(xì)講解

    GoLang內(nèi)存模型詳細(xì)講解

    go官方介紹go內(nèi)存模型的時(shí)候說(shuō):探究在什么條件下,goroutine 在讀取一個(gè)變量的值的時(shí),能夠看到其它 goroutine 對(duì)這個(gè)變量進(jìn)行的寫(xiě)的結(jié)果,Go內(nèi)存模型規(guī)定了一些條件,在這些條件下,在一個(gè)goroutine中讀取變量返回的值能夠確保是另一個(gè)goroutine中對(duì)該變量寫(xiě)入的值
    2022-12-12
  • 深入理解go sync.Once的具體使用

    深入理解go sync.Once的具體使用

    在很多情況下,我們可能需要控制某一段代碼只執(zhí)行一次,go 為我們提供了?sync.Once?對(duì)象,它保證了某個(gè)動(dòng)作只被執(zhí)行一次,本文主要介紹了深入理解go sync.Once的具體使用,感興趣的可以了解一下
    2024-01-01
  • 一文帶你使用golang手?jǐn)]一個(gè)websocket中間件

    一文帶你使用golang手?jǐn)]一個(gè)websocket中間件

    這篇文章主要為大家詳細(xì)介紹了如何使用golang手?jǐn)]一個(gè)websocket中間件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下
    2023-12-12
  • Bililive-go 實(shí)現(xiàn)直播自動(dòng)監(jiān)控錄制功能

    Bililive-go 實(shí)現(xiàn)直播自動(dòng)監(jiān)控錄制功能

    最近有直播錄制的需求,但是自己手動(dòng)錄制太麻煩繁瑣,于是用了開(kāi)源項(xiàng)目Bililive-go進(jìn)行全自動(dòng)監(jiān)控錄制,對(duì)Bililive-go 直播自動(dòng)監(jiān)控錄制實(shí)現(xiàn)思路感興趣的朋友,一起看看吧
    2024-03-03
  • golang context接口類(lèi)型方法介紹

    golang context接口類(lèi)型方法介紹

    這篇文章主要為大家介紹了golang context接口類(lèi)型方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Go?http重試請(qǐng)求的示例

    使用Go?http重試請(qǐng)求的示例

    開(kāi)發(fā)中對(duì)于http請(qǐng)求是經(jīng)常遇到,一般可能網(wǎng)絡(luò)延遲或接口返回超時(shí),這篇文章主要介紹了使用Go?http重試請(qǐng)求的示例,需要的朋友可以參考下
    2022-08-08
  • Go實(shí)現(xiàn)文件上傳和下載

    Go實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Go實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Golang中對(duì)json的優(yōu)雅處理方式

    Golang中對(duì)json的優(yōu)雅處理方式

    這篇文章主要給大家介紹了關(guān)于Golang中對(duì)json的優(yōu)雅處理方式,解析JSON在golang中很麻煩,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Go sync WaitGroup使用深入理解

    Go sync WaitGroup使用深入理解

    這篇文章主要為大家介紹了Go sync WaitGroup使用深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 深入探索Go語(yǔ)言中unsafe包的使用

    深入探索Go語(yǔ)言中unsafe包的使用

    Go語(yǔ)言的unsafe包被譽(yù)為黑科技,它為Go語(yǔ)言提供了底層訪問(wèn)和操控內(nèi)存的能力,本文將深入探討Go語(yǔ)言中unsafe包的使用方法和注意事項(xiàng),需要的可以參考一下
    2023-04-04

最新評(píng)論

济南市| 麟游县| 郸城县| 界首市| 兴海县| 山西省| 渭南市| 天等县| 田林县| 巫山县| 舟曲县| 平遥县| 浮山县| 新巴尔虎右旗| 平南县| 宜州市| 聂拉木县| 鄂温| 伊通| 成都市| 杭锦旗| 滨海县| 馆陶县| 普兰县| 全州县| 郸城县| 玛曲县| 樟树市| 洛浦县| 民权县| 泗阳县| 平塘县| 乾安县| 绿春县| 即墨市| 隆安县| 永春县| 米易县| 三穗县| 连城县| 南华县|