n1.Go语言之三方扩展学习记录
2023-06-13 09:13:35 时间
[TOC]
序列化&数据交换
本文主要介绍二进制协议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)之间交换数据。但它更快更小。 安装
go get -u github.com/vmihailenco/msgpack
示例
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:"男"}
}
相关文章
- GO和KEGG富集结果如何显示基因symbol
- 2022-09-10:以下go语言代码输出什么?A:编译错误;B:49.0;C:49。package mainimport (
- Redis API——Set功能实践与性能测试【Go版】
- 玩转 Go 生态|Hertz WebSocket 扩展简析
- 基于go语言搭建高性能IM系统
- Go 介绍与常见数据类型
- Go常见错误集锦之接口污染
- 「Go工具箱」推荐一个变量调试神器:go-spew
- 从 Java 的角度看待 Go 的内存管理| 青训营笔记
- Go 指针、uintptr、unsafe.Pointer之间如何转换
- 【翻译】使用Go生成一个随机字符串(密码)
- Go-包管理-go install
- Go语言标准库强大
- 精通Go语言开发Redis应用(go语言redis开发)
- Linux上构建Go开发环境(linux安装go环境)
- 程序Linux上运行Go语言程序的指南(linux运行go)
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 语言结合SQL Server,Go谱写新篇章(sqlserver的go)
- 一步一步学习Go读取Oracle数据库(go读取oracle)
- ODBC数据驱动程序连接Oracle数据库Go语言之旅(go使用oracle)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- Go语句让Oracle数据库管理更方便(oracle go语句)
- GO语言标准错误处理机制error用法实例