Golang通过Gzip压缩数据

xiaohai 2019-10-17 09:26:10 2517人围观 标签: Go  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,否则得不到任何数据。