给定以下函数
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
}
处理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
}
在这种情况下,我必须返回os.File
,才能在父级中调用file.Close()
.
我发现了这个相关的问题:How to defer resource cleanup when that resource outlives the scope of the surrounding function?不幸的是,建议的解决方案对于我的用例来说仍然很尴尬.