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

package mainimport (    "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}