• 032 二进制协议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("%#v
    ", 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:%T
    ", 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:%T
    ", 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:%#v
    ", p2) // p2:main.Person{Name:"沙河娜扎", Age:18, Gender:"男"}
    }
    
  • 相关阅读:
    Python----路由器远程控制
    进程和线程的区别
    tengine日志切割-配置分钟级别日志自动切割
    grep每次读取多大的文本
    bc 进制间转换
    二分法猜数字
    What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR
    Nginx配置两份日志记录
    Nginx启动报错误unlink() “nginx.pid” failed (2: No such file or directory)
    Mysql 数据库crash恢复
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11999886.html
Copyright © 2020-2023  润新知