golang用來序列化的模塊有很多,我們來介紹3個(gè)。
json
首先登場的是json,這個(gè)幾乎毋庸置疑。
序列化
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)于起了一個(gè)別名xxx,以后序列化出來的字段就叫這個(gè)名字,
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)建一個(gè)變量
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提供的“私有”的編解碼方式,它的效率會(huì)比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)容會(huì)被放進(jìn)buf里面
fmt.Println(buf.String())
/*
G��Girl�� Name Age Gender Where
Is_married !��satori f東方地靈殿
*/
}
}
發(fā)現(xiàn)是亂碼,因?yàn)檫@類似python的pickle,是該語言獨(dú)有的。所以我們不認(rèn)識(shí)沒關(guān)系,golang認(rèn)識(shí)就行了
反序列化
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類似,只不過可以傳入一個(gè)初始的byte數(shù)組,返回一個(gè)指針
dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
//調(diào)用Decode方法,傳入結(jié)構(gòu)體對(duì)象指針,會(huì)自動(dòng)將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}
//這個(gè)沒有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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- golang中的net/rpc包使用概述(小結(jié))
- go語言net包rpc遠(yuǎn)程調(diào)用的使用示例
- Golang Gob編碼(gob包的使用詳解)