给定一个io.ReadCloser,例如来自HTTP请求的响应,最有效的方式是什么,既可以降低内存开销,又可以提高代码可读性,将响应流式传输到文件中?
给定一个io.ReadCloser,例如来自HTTP请求的响应,最有效的方式是什么,既可以降低内存开销,又可以提高代码可读性,将响应流式传输到文件中?
io.Copy毫无疑问在代码方面是最高效的;您只需要
outFile, err := os.Create(filename)
// handle err
defer outFile.Close()
_, err = io.Copy(outFile, res.Body)
// handle err
从 CPU 和内存的角度来看,这也很可能非常高效。如果您想了解更多,可以查看io.Copy 的实现; 假设正文没有实现 WriteTo
并且文件没有实现 ReadFrom
(快速浏览表明它们没有),Copy
将一次复制多达32kB的数据块。使用更大的块可能会使用更少的CPU,但会使用更多的内存; 他们选择的值似乎是一个很好的折衷。
io.CopyBuffer
,它允许您传递要用于复制操作的缓冲区。 - JimBoutfile.ReadFrom(res.Body)
。 - Charlie Tumahai另一个选项是File.ReadFrom
:
package main
import (
"net/http"
"os"
)
func main() {
r, e := http.Get("https://stackoverflow.com")
if e != nil {
panic(e)
}
defer r.Body.Close()
f, e := os.Create("index.html")
if e != nil {
panic(e)
}
defer f.Close()
f.ReadFrom(r.Body)
}
io.Copy
呢? - user3591723Copy(dst Writer, src Reader)
时,不太清楚io.ReadCloser和File实现了Reader和Writer接口。 - mbrevoortio.ReadCloser
实现了Reader
(和Closer
)。我猜File
需要一点挖掘,但人们会期望能够读写文件。 - user3591723