如何将以下代码转换为使用流/管道,以便我不需要将完整内容读入内存?就像是:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
bur*_*rfl 52
怎么样io.Copy()?其文档可在以下网址找到:http://golang.org/pkg/io/#Copy
不过,这很简单.给它一个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)
}
Run Code Online (Sandbox Code Playgroud)
我没有测试过上面的内容; 我刚从上面的例子中快速地将它一起攻击,但如果不是钱,它应该很接近.
小智 8
另一个选项是File.ReadFrom:
package main
import (
"net/http"
"os"
)
func main() {
r, e := http.Get("http://speedtest.lax.hivelocity.net")
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)
}
Run Code Online (Sandbox Code Playgroud)