Go中Gzip与json搭配实现数据压缩demo
更新时间:2023年05月25日 09:06:50 作者: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 压缩数据的资料请关注脚本之家其它相关文章!
最新评论