Go中最有效的方法是将io.ReadCloser流式传输到文件中?

时间:2015-08-12 02:06:35

标签: go

给定一个io.ReadCloser,例如,来自HTTP请求的响应,在内存开销和代码可读性方面,将响应流式传输到文件的最有效方法是什么?

2 个答案:

答案 0 :(得分:11)

毫无疑问,{p> io.Copy在代码方面效率最高;你只需要

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)
}

https://golang.org/pkg/os#File.ReadFrom