二进制协议gob及msgpack介绍 - Go语言中文社区

二进制协议gob及msgpack介绍


更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11517502.html

本文主要介绍二进制协议gob及msgpack的基本使用。

最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空接口存放的数字类型(整型、浮点型等)都序列化成float64类型。

我们构造一个结构体如下:

type s struct {
    data map[string]interface{}
}

一、json序列化的问题

func jsonDemo() {
    var s1 = s{
        data: make(map[string]interface{}, 8),
    }
    s1.data["count"] = 1
    ret, err := json.Marshal(s1.data)
    if err != nil {
        fmt.Println("marshal failed", err)
    }
    fmt.Printf("%#vn", string(ret))
    var s2 = s{
        data: make(map[string]interface{}, 8),
    }
    err = json.Unmarshal(ret, &s2.data)
    if err != nil {
        fmt.Println("unmarshal failed", err)
    }
    fmt.Println(s2)
    for _, v := range s2.data {
        fmt.Printf("value:%v, type:%Tn", v, v)
    }
}

输出结果:

"{"count":1}"
{map[count:1]}
value:1, type:float64

二、gob序列化示例

标准库gob是golang提供的“私有”的编解码方式,它的效率会比json,xml等更高,特别适合在Go语言程序间传递数据。

func gobDemo() {
    var s1 = s{
        data: make(map[string]interface{}, 8),
    }
    s1.data["count"] = 1
    // encode
    buf := new(bytes.Buffer)
    enc := gob.NewEncoder(buf)
    err := enc.Encode(s1.data)
    if err != nil {
        fmt.Println("gob encode failed, err:", err)
        return
    }
    b := buf.Bytes()
    fmt.Println(b)
    var s2 = s{
        data: make(map[string]interface{}, 8),
    }
    // decode
    dec := gob.NewDecoder(bytes.NewBuffer(b))
    err = dec.Decode(&s2.data)
    if err != nil {
        fmt.Println("gob decode failed, err", err)
        return
    }
    fmt.Println(s2.data)
    for _, v := range s2.data {
        fmt.Printf("value:%v, type:%Tn", v, v)
    }
}

三、msgpack

MessagePack是一种高效的二进制序列化格式。它允许你在多种语言(如JSON)之间交换数据。但它更快更小。

3.1 安装

go get -u github.com/vmihailenco/msgpack

3.2 示例

package main

import (
    "fmt"

    "github.com/vmihailenco/msgpack"
)

// msgpack demo

type Person struct {
    Name   string
    Age    int
    Gender string
}

func main() {
    p1 := Person{
        Name:   "沙河娜扎",
        Age:    18,
        Gender: "男",
    }
    // marshal
    b, err := msgpack.Marshal(p1)
    if err != nil {
        fmt.Printf("msgpack marshal failed,err:%v", err)
        return
    }

    // unmarshal
    var p2 Person
    err = msgpack.Unmarshal(b, &p2)
    if err != nil {
        fmt.Printf("msgpack unmarshal failed,err:%v", err)
        return
    }
    fmt.Printf("p2:%#vn", p2) // p2:main.Person{Name:"沙河娜扎", Age:18, Gender:"男"}
}
版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/nickchen121/p/11517433.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-10-27 21:38:58
  • 阅读 ( 968 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢