亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang的序列化與反序列化的幾種方式

 更新時間:2020年10月23日 10:44:30   作者:古明地盆  
這篇文章主要介紹了golang的序列化與反序列化的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

golang用來序列化的模塊有很多,我們來介紹3個。

json

首先登場的是json,這個幾乎毋庸置疑。

序列化

package main

import (
 "encoding/json"
 "fmt"
)

type Girl struct {
 Name string
 Age int
 Gender string
 Where string
 Is_married bool
}

func main() {
 g := Girl{"satori", 16, "f","東方地靈殿", false}

 //可以直接使用json.Marshal,但是打印出來不好看,這里加上縮進(jìn)
 ret, err := json.MarshalIndent(g, "", " ")
 if err != nil {
 fmt.Println(err)
 } else {
 //得到的是字節(jié)數(shù)組,需要轉(zhuǎn)化成string
 fmt.Println(string(ret))
 /*
 {
  "Name": "satori",
  "Age": 16,
  "Gender": "f",
  "Where": "東方地靈殿",
  "Is_married": false
 }
 */
 }
}

當(dāng)然golang的大小寫我們知道是具有含義的,如果改成小寫, 那么該字段是無法被序列化的。但是這樣序列化之后的字段,也是大寫,如果我們就想要小寫該怎么辦呢?

package main

import (
 "encoding/json"
 "fmt"
)

type Girl struct {
 //使用`json:"xxx"`相當(dāng)于起了一個別名xxx,以后序列化出來的字段就叫這個名字,
 Name string `json:"name"`
 Age int `json:"age"`
 Gender string `json:"gender"`
 Where string `json:"where"`
 Is_married bool `json:"is_married"`
}

func main() {
 g := Girl{"satori", 16, "f","東方地靈殿", false}

 ret, err := json.MarshalIndent(g, "", " ")
 if err != nil {
 fmt.Println(err)
 } else {
 fmt.Println(string(ret))
 /*
 {
  "name": "satori",
  "age": 16,
  "gender": "f",
  "where": "東方地靈殿",
  "is_married": false
 }
 */
 }
}

反序列化

package main

import (
 "encoding/json"
 "fmt"
)

type Girl struct {
 Name string `json:"name"`
 Age int `json:"age"`
 Gender string `json:"gender"`
 Where string `json:"where"`
 Is_married bool `json:"is_married"`
}

func main() {
 g := Girl{"satori", 16, "f","東方地靈殿", false}

 ret, err := json.MarshalIndent(g, "", " ")
 if err != nil {
 fmt.Println(err)
 return
 }

 //創(chuàng)建一個變量
 g2 := Girl{}
 //傳入json字符串,和指針
 err = json.Unmarshal(ret, &g2)
 if err != nil {
 fmt.Println(err)
 }
 fmt.Println(g2) //{satori 16 f 東方地靈殿 false}
 fmt.Println(g2.Name, g2.Age) // satori 16
}

gob

標(biāo)準(zhǔn)庫gob是golang提供的“私有”的編解碼方式,它的效率會比json,xml等更高,特別適合在Go語言程序間傳遞數(shù)據(jù)。

序列化

package main

import (
 "bytes"
 "encoding/gob"
 "fmt"
)

type Girl struct {
 Name    string
 Age    int  `json:"age"`
 Gender   string `json:"gender"`
 Where   string `json:"where"`
 Is_married bool  `json:"is_married"`
}

func main() {
 g := Girl{"satori", 16, "f", "東方地靈殿", false}

 //創(chuàng)建緩存
 buf := new(bytes.Buffer)
 //把指針丟進(jìn)去
 enc := gob.NewEncoder(buf)

 //調(diào)用Encode進(jìn)行序列化
 if err := enc.Encode(g); err != nil {
 fmt.Println(err)
 return
 } else {
 //序列化的內(nèi)容會被放進(jìn)buf里面
 fmt.Println(buf.String())
 /*
 G��Girl�� Name Age Gender Where 
 Is_married  !��satori f東方地靈殿
 */
 }
}

發(fā)現(xiàn)是亂碼,因為這類似python的pickle,是該語言獨有的。所以我們不認(rèn)識沒關(guān)系,golang認(rèn)識就行了

反序列化

package main

import (
 "bytes"
 "encoding/gob"
 "fmt"
)

type Girl struct {
 Name    string
 Age    int  `json:"age"`
 Gender   string `json:"gender"`
 Where   string `json:"where"`
 Is_married bool  `json:"is_married"`
}

func main() {
 g := Girl{"satori", 16, "f", "東方地靈殿", false}

 buf := new(bytes.Buffer)
 enc := gob.NewEncoder(buf)
 if err := enc.Encode(g);err != nil {
 fmt.Println(err)
 return
 }

 var g1 = Girl{}
 //bytes.NewBuffer和bytes.Buffer類似,只不過可以傳入一個初始的byte數(shù)組,返回一個指針
 dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
 //調(diào)用Decode方法,傳入結(jié)構(gòu)體對象指針,會自動將buf.Bytes()里面的內(nèi)容轉(zhuǎn)換成結(jié)構(gòu)體
 if err := dec.Decode(&g1);err != nil {
 fmt.Println(err)
 return
 } else {
 fmt.Println(g1) // {satori 16 f 東方地靈殿 false}
 }
}

msgpack

MessagePack是一種高效的二進(jìn)制序列化格式。它允許你在多種語言(如JSON)之間交換數(shù)據(jù)。但它更快更小。

安裝

go get -u github.com/vmihailenco/msgpack

序列化和反序列化

接口和json是一致的

package main

import (
 "fmt"
 "github.com/vmihailenco/msgpack"
)

type Girl struct {
 Name    string
 Age    int  `json:"age"`
 Gender   string `json:"gender"`
 Where   string `json:"where"`
 Is_married bool  `json:"is_married"`
}

func main() {
 g := Girl{"satori", 16, "f", "東方地靈殿", false}

 //這個沒有MarshalIndent
 if ret, err := msgpack.Marshal(g); err != nil {
 fmt.Println(err)
 return
 } else {
 fmt.Println(string(ret)) //��Name�satori�Age�    �Gender�f�Where�東方地靈殿�Is_married�
 var g1 = Girl{}
 if err := msgpack.Unmarshal(ret, &g1);err!=nil {
  fmt.Println(err)
  return
 } else {
  fmt.Println(g1) // {satori 16 f 東方地靈殿 false}
 }
 }
}

到此這篇關(guān)于golang的序列化與反序列化的幾種方式的文章就介紹到這了,更多相關(guān)golang 序列化與反序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    這篇文章主要介紹了Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Golang實現(xiàn)微信公眾號后臺接入的示例代碼

    Golang實現(xiàn)微信公眾號后臺接入的示例代碼

    這篇文章主要介紹了Golang實現(xiàn)微信公眾號后臺接入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • golang中strconv.ParseInt函數(shù)用法示例

    golang中strconv.ParseInt函數(shù)用法示例

    這篇文章主要介紹了golang中strconv.ParseInt函數(shù)用法,實例分析了strconv.ParseInt函數(shù)將字符串轉(zhuǎn)換為數(shù)字的簡單使用方法,需要的朋友可以參考下
    2016-07-07
  • golang判斷兩個事件是否存在沖突的方法示例

    golang判斷兩個事件是否存在沖突的方法示例

    這篇文章主要為大家詳細(xì)介紹了golang判斷兩個事件是否存在沖突的方法示例,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Golang圖片驗證碼的使用方法

    Golang圖片驗證碼的使用方法

    最近在使用到Golang進(jìn)行原生開發(fā),注冊和登錄頁面都涉及到圖片驗證碼的功能,支持很多類型的驗證方式,例如支持?jǐn)?shù)字類型、字母類型、音頻驗證碼、中文驗證碼,本文給大家介紹Golang圖片驗證碼的使用,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    本文主要介紹了Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝教程

    Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝教程

    mongodb官方?jīng)]有關(guān)于go的mongodb的驅(qū)動,因此只能使用第三方驅(qū)動,mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關(guān)于利用Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • Golang實現(xiàn)對map的并發(fā)讀寫的方法示例

    Golang實現(xiàn)對map的并發(fā)讀寫的方法示例

    這篇文章主要介紹了Golang實現(xiàn)對map的并發(fā)讀寫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • golang之JWT實現(xiàn)的示例代碼

    golang之JWT實現(xiàn)的示例代碼

    這篇文章主要介紹了golang之JWT實現(xiàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • GO語言實現(xiàn)標(biāo)題閃爍效果

    GO語言實現(xiàn)標(biāo)題閃爍效果

    這篇文章主要介紹了GO語言實現(xiàn)標(biāo)題閃爍效果,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論