小编use*_*261的帖子

使用中间资源时如何处理函数中的“defer”

给定以下函数

func jsonBodyReader(config Config, r *http.Request) (io.Reader, error) {
    bodyReader := io.LimitReader(r.Body, config.Reports.Max.Body)
    // defer r.Body.Close()

    gzipReader, err := gzip.NewReader(bodyReader)
    if err != nil {
        return nil, err
    }
    // defer gzipReader.Close()

    return io.LimitReader(gzipReader, config.Reports.Max.Json), nil
}
Run Code Online (Sandbox Code Playgroud)

r.Body处理和延迟关闭的最佳方法是什么gzipReader

是否真的有必要始终返回所有中间资源/流/读取器才能在父函数中推迟/关闭它们?

另一个例子

func save(target string, reader io.Reader) (io.Reader, *os.File, error) {
    file, err := os.Create(target)
    if err != nil {
        return reader, nil, err
    }
    /// defer file.Close()

    return io.TeeReader(reader, file), file, nil
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我必须返回os.File才能打电话file.Close()给家长。 …

go

1
推荐指数
1
解决办法
46
查看次数

标签 统计

go ×1