给定一个io.ReadCloser,例如,来自HTTP请求的响应,在内存开销和代码可读性方面,将响应流式传输到文件的最有效方法是什么?
答案 0 :(得分:11)
outFile, err := os.Create(filename)
// handle err
defer outFile.Close()
_, err = io.Copy(outFile, res.Body)
// handle err
在CPU和内存方面,它也可能非常高效。如果你愿意,你可以偷看implementation of io.Copy;假设正文没有实现WriteTo
并且文件没有实现ReadFrom
(快速浏览一下就知道他们没有),Copy
会复制一次最多32kB的块。更大的块可能会使用更少的CPU但更多的内存;他们选择的价值似乎是一个很好的权衡。
答案 1 :(得分:0)
另一个选项是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)
}