golang 使用gzip对json例子

news/2024/12/18 15:12:48/文章来源:https://www.cnblogs.com/chen1880/p/18615018
package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io"
    "log"
)

// User 结构体定义
type User struct {
    ID   int     `json:"id"`
    Name string  `json:"name"`
    Age  int     `json:"age"`
    Fee  float64 `json:"fee"`
}

// gzipCompress 将任何类型的接口压缩为 Gzip 格式
func gzipCompress(v interface{}) ([]byte, error) {
    // 将结构体转换为JSON字节切片
    jsonData, err := json.Marshal(v)
    if err != nil {
        return nil, err
    }

    var buf bytes.Buffer
    // 创建Gzip Writer
    w := gzip.NewWriter(&buf)
    if _, err := w.Write(jsonData); err != nil {
        return nil, err
    }

    // 关闭Gzip Writer
    if err := w.Close(); err != nil {
        return nil, err
    }

    return buf.Bytes(), nil
}

// gzipDecompress 解压缩 Gzip 数据,填充到目标结构体
func gzipDecompress(compressedData []byte, v interface{}) error {
    r, err := gzip.NewReader(bytes.NewReader(compressedData))
    if err != nil {
        return err
    }
    defer r.Close()

    // 读取解压缩后的数据
    decompressedData, err := io.ReadAll(r)
    if err != nil {
        return err
    }

    // 将JSON数据解码到目标结构体
    return json.Unmarshal(decompressedData, v)
}

// 主函数
func main() {
    // 创建示例用户数据
    user := User{
        ID:   1,
        Name: "Alice",
        Age:  30,
        Fee:  1500.00,
    }

    // 压缩JSON数据
    compressedData, err := gzipCompress(user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Compressed Data (Gzip bytes): %v\n", compressedData)

    // 解压缩回原始的用户数据
    var decompressedUser User
    if err := gzipDecompress(compressedData, &decompressedUser); err != nil {
        log.Fatal(err)
    }

    // 输出解压缩后的数据
    fmt.Printf("Decompressed User: %+v\n", decompressedUser)
}
 
输出:
Compressed Data (Gzip bytes): [31 139 8 0 0 0 0 0 0 255 170 86 202 76 81 178 50 212 81 202 75 204 77 85 178 82 114 204 201 76 78 85 210 81 74 76 79 85 178 50 54 208 81 74 75 77 85 178 50 52 53 48 168 5 4 0 0 255 255 212 252 187 47 43 0 0 0]
Decompressed User: {ID:1 Name:Alice Age:30 Fee:1500}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/854830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清明上河图密码 26 集 电视剧 All In One

清明上河图密码 26 集 电视剧 All In One 《清明上河图密码》2024年播出的中国大陆古装悬疑电视剧,改编自中国大陆作家冶文彪创作的同名小说,由电影《男欢女爱》的导演杨帆与《深渊宝藏》的导演熊琛联合执导,张颂文、白百何领衔主演,周一围、侯岩松特别主演,张耀、夏梦、林…

python执行subprocess.run报错

问题 执行 subprocess.run(command, check=True) 时报错 File "C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1420, in _execute_childhp, ht, pid, tid = _winapi.CreateProcess(executable, args,FileNotFoundError:[WinError 2…

二:使用正点原子的直流无刷驱动板自写FOC控制永磁同步(PMSM)电机(位置闭环)

在上一篇博客中配置了UVW三相PWM的定时器,在此基础上增加配置ABZ编码器定时器启用一个定时器中断,用于PID处理 代码如下// 常量定义 #define PI 3.14159265359f #define PWM_RESOLUTION 5250.0f // PWM分辨率 #define CIRCLE_RESOLUTION 1000 // 圆周分辨率 #define MOTOR_…

易基因:游离细胞DNA(cfDNA)检测整体研究方案

01.技术简述 细胞游离DNA(cell-free DNA,cfDNA)是指在生物体的体液中(如血浆、尿液、脑脊液等)自由存在的、非细胞内的DNA片段。这些DNA片段通常来源于细胞凋亡(程序性死亡)或坏死(细胞损伤或死亡后释放),可以被释放到循环系统中,并在体液中被检测到。cfDNA研究和应…

域名历史是什么?怎么进行域名历史查询?

域名是互联网上用来识别和访问网站的一个易于记忆的地址。它将IP地址转换成人类可读的格式,例如 www.example.com。域名是互联网的基础,每个网站都需要一个独特的域名以便用户能够访问。 什么是域名历史? 域名历史记录了一个域名自注册以来的所有变更,包括所有权、DNS设置、…

四款电脑桌面好用的备忘录app推荐,可同步手机

1、sticky notes 这款是Windows系统自带的备忘记事工具,中文名叫“便笺”。点击桌面左下角“开始”,在程序列表中可找到。 它在电脑桌面上是以一张一张彩色便利贴展现的,可以记录简单的文字和图片,非常像纸质便利贴的电子版。 可以通过Office365和手机端同步数据。2、敬业签…

GO 学习笔记之零 (二)git 操作

一、克隆git上仓库指定分支到本地 1、使用 VSCODE 工具详见:GO 学习笔记之一 环境安装 - 夏之夜 - 博客园 文章中的 第四章节的 "导入git项目" 二、git项目本地更改提交到git仓库 1、使用 VSCODE 工具 1.1 工程只有一人开发,不存在冲突的场景点击 VSCODE工具上的“…

写了两个自动化脚本,从下载-构建-打包-提取-备份-更新-重启

##!/bin/bash# 定义颜色用于日志输出 RED=\033[0;31m GREEN=\033[0;32m YELLOW=\033[1;33m NC=\033[0m # No Color# 检查参数 if [ -z "$1" ]; thenecho -e "${RED}错误: 未传入分支号!${NC}"echo "用法: $0 <分支号>"exit 1 fi# 读取分支…

冰雪旅游大爆发:如何优化冰雪旅游管理与服务——看板软件篇

利用板栗看板进行冰雪旅游的旅游管理与运营可以带来诸多便利和效益。通过明确目标与需求、创建项目列表、信息整合与展示、游客管理与服务、数据分析与决策支持以及团队协作与沟通等方面的应用,可以显著提升冰雪旅游的管理效率和服务质量。Wind数据显示,自9月份以来,冰雪旅游…

CI/CD方案:推动智能汽车开发的高效利器

CI/CD方案:推动智能汽车开发的高效利器在智能化和自动驾驶技术飞速发展的背景下,汽车软件开发的复杂性正以前所未有的速度增长。面对市场对效率、质量和快速迭代的高需求,传统开发模式已然捉襟见肘。作为提升开发效率和质量的核心工具,CI/CD(持续集成与持续交付/部署)方案…

说一个使用okhttp的理由

当时公司为了让接入网关变的简单,于是就开发了一个client,然后给各个服务去使用。 有一次发送请求的时候,发现报timeout了,但实际上业务已经执行成功了。于是就去追代码,发现使用的尽然是hutool包的工具,那个真是糊涂呀 。 看代码发现没有指定timeout的参数就使用了默认参…

大学生职业规划模板汇总(大学生职业规划大赛PPT模板)

前言 全国大学生职业规划大赛是由教育部举办的赛事,首届大赛于2023年9月至2024年5月举办,总决赛在上海市举行。生涯教育与就业指导工作贯穿高校招生、培养、就业全过程,是就业指导服务的核心内容、强化价值观引导的重要载体、促进毕业生高质量充分就业的基础工作。以全国大学…