golang 使用gzip对json例子

devtools/2024/12/24 1:10:37/

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.ppmy.cn/devtools/144852.html

相关文章

前端笔试面试题目——数据结构和算法篇(一)

大厂前端笔试面试题中常见的算法和数据结构题目可以总结为以下几个方面: 数据结构题目 数组与链表: 数组与链表的区别,包括元素个数、存储单元、元素的顺序关系等。链表的反转、合并等操作。判断链表中是否有环。 栈与队列: 栈的…

UVM 验证方法学之interface学习系列文章(十一)virtual interface 再续篇

一 前言 并非总是可以将被测单元(DUT)视为一个黑盒,即仅监控和驱动DUT的顶层端口信号。这一点在从模块级测试转向更大规模的系统级测试时尤为明显。有时,我们需要了解实现细节以便访问DUT内部的信号。这被称为白盒验证。 Verilog一直提供从其他作用域访问几乎任何层次结构…

Vue Web开发(十)

1. 用户管理新增,搜索,编辑,删除 本节课完成用户列表表单设计,使用table组件,同样模块化组件,CommonTable.vue组件,并且在User页面中引入,mock实现数据模拟,最终完成用户…

Vue的响应式基础

1.SetUp https://cn.vuejs.org/api/composition-api-setup.html#basic-usage setup是Vue3中一个新的配置项,值是一个函数,它是 Composition API (组合式)“表演的舞台”,组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup中。 特点如下: setup函数返…

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么: WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具,它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL: Docker 依赖 Linux 内核功能,WSL 2 提供了一个高性能、轻量级的…

【Java入门指南 Day11:Lambda表达式与Stream API】

一、Lambda表达式基础 Lambda表达式是Java 8引入的一个重要特性,它让我们可以将行为像数据一样传递。可以把它理解为一种简洁的、匿名的函数定义方式。 Lambda表达式语法 // 基本语法: (参数) -> {表达式}// 1. 无参数 Runnable r () -> System.out.print…

微服务核心概念介绍

微服务架构的核心概念包括: 1. 服务拆分与粒度:将应用程序按照业务领域或功能边界拆分为多个粒度适中的服务,每个服务都负责完成一项具体的业务功能或流程。 2. 自治性:每个微服务都是自治的,意味着它们可以独立地进行…

RK3568平台(KBuild篇)KBuild编译体系

一.KBuild体系简介 从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这和过去的编译系统有很大的不同,尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取…