Go 中 Gzip 与 json 搭配使用压缩数据,减少数据传输量

2023-05-16

Go 中 Gzip 与 json 搭配使用压缩数据

前言

在日常工作中,如果遇到数据量大的情况,在 db 中是不能直接存储某些字段的,一般会用 json 进行marshal 为 byte 再存入。但是如果此时占用空间依旧过大,则可以考虑再用 gzip 还进一步压缩。

Gzip 包

go标准库的gzip包中提供了两个操作,分别是压缩和解压

常量和变量

    const (
        NoCompression = flate.NoCompression // 不压缩
        BestSpeed = flate.BestSpeed // 最快速度
        BestCompression = flate.BestCompression // 最佳压缩比
        DefaultCompression = flate.DefaultCompression   // 默认压缩比
    )
    var (
        // 当读取gzip数据时发现无效的校验和时将返回该错误
        ErrChecksum = errors.New("gzip: invalid checksum")
        // 当读取gzip数据时发现无效的数据头时将返回该错误
        ErrHeader = errors.New("gzip: invalid header")
    )
    //数据头结构
    type Header struct {
        Comment string    // 文件注释
        Extra   []byte    // 附加数据
        ModTime time.Time // 文件修改时间
        Name    string    // 文件名
        OS      byte      // 操作系统类型
    }

Gzip 用法

压缩

func Encode(input []byte) ([]byte, error) {
	// 创建一个新的 byte 输出流
	var buf bytes.Buffer
	// 创建一个新的 gzip 输出流
	gzipWriter := gzip.NewWriter(&buf)
	// 将 input byte 数组写入到此输出流中
	_, err := gzipWriter.Write(input)
	if err != nil {
		_ = gzipWriter.Close()
		return nil, err
	}
	if err := gzipWriter.Close(); err != nil {
		return nil, err
	}
	// 返回压缩后的 bytes 数组
	return buf.Bytes(), nil
}

解压

func Decode(input []byte) ([]byte, error) {
	// 创建一个新的 gzip.Reader
	bytesReader := bytes.NewReader(input)
	gzipReader, err := gzip.NewReader(bytesReader)
	if err != nil {
		return nil, err
	}
	defer func() {
		// defer 中关闭 gzipReader
		_ = gzipReader.Close()
	}()
	buf := new(bytes.Buffer)
	// 从 Reader 中读取出数据
	if _, err := buf.ReadFrom(gzipReader); err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

与 json 搭配使用

// 压缩
func MarshalToJsonWithGzip(jsonData anyStruct) []byte {
	dataAfterMarshal, _ := json.Marshal(jsonData)
	dataAfterGzip, err := gzip.Encode(dataAfterMarshal)
	if err != nil {
		return nil
	}
	return dataAfterGzip
}
// 解压
func UnmarshalDataFromJsonWithGzip(msg []byte) (*anyStruct, error) {
	dataAfterDecode, err := gzip.Decode(msg)
	if err != nil {
		return nil, err
	}
	data := &anyStruct{}
	err = json.Unmarshal(dataAfterDecode, data)
	if err != nil {
		return nil, err
	}
	return data, nil
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中 Gzip 与 json 搭配使用压缩数据,减少数据传输量 的相关文章

  • 大学阶段总结

    总结一下自己的大学生活 学业 大一基本上是在课业学习和ACM训练的平稳有序的生活中度过 xff0c 也没干什么其他事了 上课学习学习 xff0c 错 xff0c 玩玩手机 xff0c 所以我两个学期的高数都是最后靠老师拉到及格 xff0c
  • 人生规划(Flag)

    生活 房 xff08 杭州住宅428w xff0c 商业128w xff0c 老家128w xff09 车 xff08 32w xff09 存款 xff08 100w xff09 结婚 在杭州干十年 xff0c 先赚个首付 xff0c 再根
  • 博客停更声明

    本博客自2022年7月1日起 xff0c 不再新增内容 之后所有新增文章将push到GitHub中 xff0c 再通过Vuepress以GitHub Page的形式发布 历史文章根据需要迁移与更新 个人网站如下 xff1a 申屠志刚 htt
  • vnc连接成功后黑屏的问题

    新弄了一个服务器 安装各种服务 装VNC遇到问题 黑屏 网上找了各种方式均为解决 最终探索出了如下解决方法 1 修改 vnc xstartup文件 首先文件权限最好设置为777 原来为 只看最后 if f etc X11 xinit xin
  • 资源-Windows10-2020原版镜像下载地址(20H2)以及1809、1803、1709

    说明 Windows10 2020原版镜像下载地址 xff08 20H2 xff09 以及Windows10 1809企业LTSC版下载地址 PS xff1a 何为LTSC版 LTSC版即为长期服务版 xff08 你也可以理解成企业精简版
  • 交通标志识别

    原文链接 xff1a https blog csdn net Mind programmonkey article details 93194997
  • 关于YOLOv3的一些细节

    原文链接 xff1a https www jianshu com p 86b8208f634f 本文是我对YOLO算法的细节理解总结 xff0c 本文的阅读前提是已读过YOLO相关论文 xff0c 文中不会谈及YOLO的发展过程 xff0c
  • Giou YOLOv3 | CVPR2019,通用,更优的检测框损失函数

    这篇论文提出的GIou损失函数 xff0c 是一种目标检测领域用于回归目标框损失函数 该Trick适用于任何目标检测算法 本文以YOLOv3为例进行阐述 论文 xff1a Generalized Intersection over Unio
  • ubuntu18.04+CUDA10+caffe+openpose环境配置与应用

    最近老板谈到了一个项目 xff0c 需要通过人的行为姿势来初步判断人在干嘛 xff0c 然后我就找到了openpose xff0c 找到源码之后 xff0c 我又粗略的看了下别人写的相关博客还有其他资料 xff0c 觉得也没什么大不了 xf
  • ubuntu18.04安装tensorflow-gpu报错

    今天因工作需要 xff0c 就打算在ubuntu系统上安装tensorflow gpu 刚开始我就直接在中断输入 pip install tensorflow gpu 61 61 1 13 1 但是发现下载速度炒鸡慢 xff0c 关键是下载
  • ubuntu18.04安装ROS Melodic的安装与卸载

    step1 设置软件源 sudo sh c 39 echo 34 deb http packages ros org ros ubuntu lsb release sc main 34 gt etc apt sources list d r
  • Win10上yolov3的配置及使用教程(VS2019)

    yolo论文翻译 或https zhuanlan zhihu com p 35023499 yolo官网 目录 硬件环境 安装教程 安装CUDA和cuDNN 下载darknet 修改darknet vcxproj 修改darknet sln
  • LabelImg的安装出现No module named 'libs.resources'错误

    如果出现No module named libs resources xff0c 直接看第7点 1 下载labelImg github地址 xff1a https github com tzutalin labelImg 34 34 34
  • Github网站重定向到自己的域名访问

    不多说 xff0c 上干货 xff01 首先你得有一个能访问搭建好的仓库网站 xff0c 而且是可视化的 如果没有请自行百度 xff01 开始 xff01 第一步 xff1a 打开你的Settings xff08 设置 xff09 xff0
  • web项目管理系统的设计

    简介 某某管理系统 xff08 员工信息 xff0c 学生成绩 xff0c 办事流程等等 xff09 应该是很多web开发者最先接触到的项目之一 xff0c 也是许多非科技企业主要维护的项目 xff0c 可以说是学习web项目最佳练手工具
  • 联邦学习算法介绍-FedAvg详细案例-Python代码获取

    联邦学习算法介绍 FedAvg详细案例 Python代码获取 一 联邦学习系统框架二 联邦平均算法 xff08 FedAvg xff09 三 联邦随梯度下降算法 FedSGD xff09 四 差分隐私随联邦梯度下降算法 DP FedSGD
  • 误勾掉Android studio4.2的Kotlin插件

    在更新安装插件时候勾掉了 Plugins中的Kotlin 重新启动时候 xff0c 导致安卓无法启动 xff0c 弹出警告 xff1a Missing Essential Plug org jetbrains android Please
  • Java中一个字符串去掉所有数字,只留下字母

    span class token keyword public span span class token keyword static span span class token keyword void span span class
  • Go中优雅的获取Map元素的多种方法

    Go语言获取map元素教程 Go 语言 中要获取 map 中的元素 xff0c 除了使用 遍历 的方式 xff0c 我们还可以使用 key 做为索引的形式来获取 map 指定 key 的元素 根据 map 的 key 获取 map 的元素
  • Go中的nil是是什么?和java的null有区别吗?

    Go面试基础 xff1a Go中的nil是是什么 xff1f 和java的null有区别吗 xff1f 前言 go语言中 xff0c 有一个和java里的null很相似的变量为nil xff0c 但它其实还是有很多特性的 xff0c 下面让

随机推荐