python3.7操作mysql_032 二进制协议gob及msgpack介绍

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\n", 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\n", 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\n", 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\n", p2) // p2:main.Person{Name:"沙河娜扎", Age:18, Gender:"男"}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值