Golang通过Gzip压缩数据
简介为了将一个大的数据进行压缩,可以采用Gzip的方式进行处理,那么在Go语言中如何通过Gzip方式压缩数据呢,在使用过程中大家也会跟我一样会踩坑。本文主要记录下问题和最终的实现方式。
通过Golang将数据通过Gzip进行压缩踩坑记录。直接贴代码如下:
package main
import (
"bytes"
"compress/gzip"
"io/ioutil"
)
/*
* Gzip压缩处理
*/
func GzipEncode(in []byte) ([]byte, error) {
var (
buffer bytes.Buffer
out []byte
err error
)
writer := gzip.NewWriter(&buffer)
//使用压缩等级
//writer, _ := gzip.NewWriterLevel(&buffer, 5)
//最开始一直把关闭放在了defer里面,但是这样压缩后数据为空
//查阅相关资料才知道:gzip压缩的过程中,Write之后一定要及时Close,不能defer,这样才能flush,否则得不到任何数据
/*defer func() {
err := writer.Close()
if err != nil {
logrus.Info("Gzip压缩失败", err.Error())
}
}()*/
_, err = writer.Write(in)
if err != nil {
err = writer.Close()
return out, err
}
if err = writer.Close(); err != nil {
return out, err
}
return buffer.Bytes(), nil
}
/*
* Gzip解压处理
*/
func GzipDecode(in []byte) ([]byte, error) {
reader, err := gzip.NewReader(bytes.NewReader(in))
if err != nil {
var out []byte
return out, err
}
defer func() {
if err = reader.Close(); err != nil {
println("Gzip解压失败", err.Error())
}
}()
return ioutil.ReadAll(reader)
}
func main() {
a, _ := GzipEncode([]byte("测试GZIP压缩"))
println("---------------压缩后数据---------------")
println(string(a))
b, _ := GzipDecode(a)
println("---------------解压后数据---------------")
println(string(b))
}
代码注释中已经说的比较清楚了,最开始是通过defer来close的,但是这样一直返回空数据。gzip压缩的过程中,Write之后一定要及时Close,不能defer,这样才能flush,否则得不到任何数据。