• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang的序列化与反序列化的几种方式

    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��Girl�� Name Age Gender Where 
     Is_married  !��satori f东方地灵殿
     */
     }
    }
    
    

    发现是乱码,因为这类似python的pickle,是该语言独有的。所以我们不认识没关系,golang认识就行了

    反序列化

    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}
     }
     }
    }

    到此这篇关于golang的序列化与反序列化的几种方式的文章就介绍到这了,更多相关golang 序列化与反序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • golang中的net/rpc包使用概述(小结)
    • go语言net包rpc远程调用的使用示例
    • Golang Gob编码(gob包的使用详解)
    上一篇:基于gin的golang web开发:路由示例详解
    下一篇:Go语言实现猜数字小游戏
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang的序列化与反序列化的几种方式 golang,的,序列化,与,反,几种,