这就是我使用 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)
}
Playground 链接 https://play.golang.org/p/oafHItGOlDN
显然,Flush + Close
和 Close
给出了不同的结果。
Docs对于 compress/gzip
包来说:
func (z *Writer) Close() error
Close closes the Writer by flushing any unwritten data to the underlying io.Writer and writing the GZIP footer. It does not close the underlying io.Writer.
这个医生说的是什么冲洗?如果 Close
就足够了,为什么还需要 Flush
函数?为什么 Close
不调用 Flush
?
最佳答案
关闭会导致刷新。当您调用 Flush
然后调用 Close
时,流会被刷新两次,这会导致输出一个额外的 block ,它使用 5 个字节来编码 0 个字节的数据。两个流编码相同的数据,但其中一个是浪费的。
至于为什么要使用 Flush,在 Flush 的文档中有解释。有时您还没有完成 编写,但您需要确保在其他数据可用之前您已编写的所有数据都可由客户端读取。在这些点上,您冲洗流。只有在没有更多数据时才会关闭。
关于go - 如果 `Flush` 就足够了,为什么还需要 `Close`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166370/