golang 使用gzip对json例子

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}

相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript