Go中Gzip与json搭配实现数据压缩demo
作者:goper
这篇文章主要为大家介绍了Go中Gzip与json搭配使用压缩数据的实现demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
正文
在日常工作中,如果遇到数据量大的情况,在db中是不能直接存储某些字段的,一般会用json进行marshal为 byte存入。但是如果此时占用空间依旧过大,则可以考虑再用gzip 还进一步压缩。
demo
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
}以上就是Go中Gzip与json搭配实现数据压缩demo的详细内容,更多关于Go 压缩数据的资料请关注脚本之家其它相关文章!
