¿Cómo canalizar una respuesta HTTP a un archivo en Go?
(1)
¿Cómo convierto el código a continuación para usar streams / pipe para que no tenga que leer todo el contenido en la memoria? Algo como: 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)
}
}
¿Qué hay de io.Copy()
? Su documentación se puede encontrar en: http://golang.org/pkg/io/#Copy
Aunque es bastante simple. Dale un io.Reader
y un io.Writer
y copia los datos, una pequeña parte a la vez (por ejemplo, no todos en la memoria a la vez).
Así que puedes intentar escribir algo como:
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)
}
No he probado lo anterior; Simplemente lo hackeé rápidamente de su ejemplo anterior, pero debería estar cerca si no fuera por el dinero.