You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.5 KiB
71 lines
1.5 KiB
package common
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"encoding/json"
|
|
)
|
|
|
|
// 压缩 与json搭配使用
|
|
func MarshalToJsonWithGzip(jsonData interface{}) []byte {
|
|
dataAfterMarshal, _ := json.Marshal(jsonData)
|
|
dataAfterGzip, err := Encode(dataAfterMarshal)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return dataAfterGzip
|
|
}
|
|
|
|
// 解压 与json搭配使用
|
|
func UnmarshalDataFromJsonWithGzip(msg []byte) (*struct{}, error) {
|
|
dataAfterDecode, err := Decode(msg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
data := &struct {
|
|
}{}
|
|
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
|
|
}
|
|
|