关于go:Go中Gzip-与-json-搭配使用压缩数据

在日常工作中,如果遇到数据量大的状况,在db中是不能间接存储某些字段的,个别会用json进行marshal为 byte存入。然而如果此时占用空间仍旧过大,则能够思考再用gzip 还进一步压缩。

package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
)

func main() {

}

type anyStruct struct {
}

// 压缩 与json搭配应用
func MarshalToJsonWithGzip(jsonData anyStruct) []byte {
    dataAfterMarshal, _ := json.Marshal(jsonData)
    dataAfterGzip, err := Encode(dataAfterMarshal)
    if err != nil {
        return nil
    }
    return dataAfterGzip
}

// 解压 与json搭配应用
func UnmarshalDataFromJsonWithGzip(msg []byte) (*anyStruct, error) {
    dataAfterDecode, err := Decode(msg)
    if err != nil {
        return nil, err
    }
    data := &anyStruct{}
    err = json.Unmarshal(dataAfterDecode, data)
    if err != nil {
        return nil, err
    }
    return data, nil
}

// 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
}

// Gzip用法 解压数据
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
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理