这就是我使用gzip writer的方式。
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte(data)); err != nil {
panic(err)
}
/*
if err := gz.Flush(); err != nil {
panic(err)
}
*/
if err := gz.Close(); err != nil {
panic(err)
}
游乐场链接https://play.golang.org/p/oafHItGOlDN
显然,Flush + Close
和Close
正在给出不同的结果。
compress/gzip
包的Docs说:
func(z * Writer)关闭()错误
Close通过将任何未写入的数据刷新到底层的io.Writer并编写GZIP页脚来关闭Writer。它不会关闭底层的io.Writer。
这位医生谈论的是什么?如果Flush
足够,为什么你需要Close
功能呢?为什么Close
不致电Flush
?
答案 0 :(得分:7)
关闭 导致刷新。当您调用Flush
然后调用Close
时,流被刷新两次,这会导致输出一个额外的块,它使用5个字节来编码0字节的数据。两个流都编码相同的数据,但其中一个是浪费。
至于为什么要使用Flush,解释就在Flush的文档中。有时您不会完成写作,但您需要确保在获得其他数据之前,客户可以读取您在此时写入的所有数据。在这些点,您刷新流。您只有在没有更多数据时才会关闭。