go - 如果 `Flush` 就足够了,为什么还需要 `Close`?

标签 go

这就是我使用 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 + CloseClose 给出了不同的结果。

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/

相关文章:

go - 从go中的另一个文件导入 map 变量

go - 请解释 golang 类型是否按值传递

testing - 如何在 Golang 中解码 Reflect.Value

go - 按名称调用接线员

go - 带范围限制的 typedef

html - 在 GoLang 中将 Json 数据映射到 Html 模板

string - 如何从Golang中的response.Cookies()中按名称获取单个cookie?

go - Go 中的垃圾收集工作由谁来完成?

javascript - 提交表单时页面重定向

caching - 如何将此缓存项转换回 map slice ?