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}
qq:505645074
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-12-18 MVC 身份证图像识别(调用dll)