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,但是打印出来不好看,这里加上缩进
ret, err := json.MarshalIndent(g, "", " ")
if err != nil {
fmt.Println(err)
} else {
//得到的是字节数组,需要转化成string
fmt.Println(string(ret))
/*
{
"Name": "satori",
"Age": 16,
"Gender": "f",
"Where": "东方地灵殿",
"Is_married": false
}
*/
}
}
当然golang的大小写我们知道是具有含义的,如果改成小写, 那么该字段是无法被序列化的。但是这样序列化之后的字段,也是大写,如果我们就想要小写该怎么办呢?
package main
import (
"encoding/json"
"fmt"
)
type Girl struct {
//使用`json:"xxx"`相当于起了一个别名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
}
//创建一个变量
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
标准库gob是golang提供的“私有”的编解码方式,它的效率会比json,xml等更高,特别适合在Go语言程序间传递数据。
序列化
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)
//调用Encode进行序列化
if err := enc.Encode(g); err != nil {
fmt.Println(err)
return
} else {
//序列化的内容会被放进buf里面
fmt.Println(buf.String())
/*
G"htmlcode">
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数组,返回一个指针
dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
//调用Decode方法,传入结构体对象指针,会自动将buf.Bytes()里面的内容转换成结构体
if err := dec.Decode(&g1);err != nil {
fmt.Println(err)
return
} else {
fmt.Println(g1) // {satori 16 f 东方地灵殿 false}
}
}
msgpack
MessagePack是一种高效的二进制序列化格式。它允许你在多种语言(如JSON)之间交换数据。但它更快更小。
安装
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}
}
}
}
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“golang的序列化与反序列化的几种方式”评论...
更新动态
2025年10月27日
2025年10月27日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]