如何将以下代码转换为使用流/管道,从而无需将全部内容读入内存?就像是: http.Get("http://example.com/").Pipe("./data.txt")
http.Get("http://example.com/").Pipe("./data.txt")
package main import ("net/http";"io/ioutil") func main() { resp, err := http.Get("http://example.com/") check(err) defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) check(err) err = ioutil.WriteFile("./data.txt", body, 0666) check(err) } func check(e error) { if e != nil { panic(e) } }
怎么io.Copy()样 可以在以下位置找到其文档:http : //golang.org/pkg/io/#Copy
io.Copy()
不过,这很简单。给它一个io.Reader和一个io.Writer,然后一次将数据复制到一个小块上(例如,一次不全部存储在内存中)。
io.Reader
io.Writer
因此,您可以尝试编写如下内容:
func main() { resp, err := http.Get("...") check(err) defer resp.Body.Close() out, err := os.Create("filename.ext") if err != nil { // panic? } defer out.Close() io.Copy(out, resp.Body) }
我还没有测试以上内容;我只是从您上面的示例中快速地将其攻破,但是如果没有钱的话,它应该很接近。