【发布时间】:2020-03-30 03:31:43
【问题描述】:
我用golang gzip.NewWriter 压缩切片,defer Close() 关闭writer。但是从压缩数据中读取时,它将返回unexpected EOF。代码是:
func main() {
a := []byte{'a', 'b', 'c', 'd', 'e', 'f'}
zippedData, err := zipData(a)
if err != nil {
panic(err)
}
unzippedData, err := unzipData(zippedData)
if err != nil {
panic(err)
}
fmt.Printf("%v\n", unzippedData)
}
zip函数为:
func zipData(originData []byte) ([]byte, error) {
var bf bytes.Buffer
gw := gzip.NewWriter(&bf)
defer gw.Close()
_, err := gw.Write(originData)
if err != nil {
return nil, errors.New(fmt.Sprintf("gzip data err: %v", err))
}
err = gw.Flush()
if err != nil {
return nil, err
}
// if I rm 'defer gw.Close()' and call 'gw.Close()' here, it'll be ok
logs.Debug("before gzip len: %v", len(originData))
logs.Debug("gzip len: %v", bf.Len())
return bf.Bytes(), nil
}
上面的zip函数使用defer gw.Close()来关闭gw。
解压函数为:
func unzipData(zippedData []byte) ([]byte, error) {
dst := make([]byte, len(zippedData))
copy(dst, zippedData)
reader, err := gzip.NewReader(bytes.NewBuffer(dst))
if err != nil {
return nil, errors.New(fmt.Sprintf("unzip err :%v", err))
}
defer reader.Close()
data, err := ioutil.ReadAll(reader)
if err != nil {
return nil, errors.New(fmt.Sprintf("read err :%v", err))
}
return data, err
}
为什么defer gw.Close() 案例unexpected EOF?
【问题讨论】:
标签: go