2013-05-01 18 views
23

İçeriğin tamamını belleğe okumak zorunda kalmamak için aşağıdaki kodu akışları/boruları kullanmak üzere nasıl dönüştürürüm? şey gibi: http.Get("http://example.com/").Pipe("./data.txt")Go'da bir dosyaya nasıl bir HTTP yanıtı iletilir?

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

Get yanıtı bir alan içerir Body hat Reader uygular. Temel olarak, içeriğini kendi dosyanıza yazan bir tür işleve aktarabilirsiniz. Hiçbir noktada vücudun tüm içeriği, sizden talep etmeniz dışında, belleğe yüklenir. – fuz

cevap

38

ne dersiniz io.Copy()? Belgeleri şu adreste bulunabilir: http://golang.org/pkg/io/#Copy

Bu oldukça basittir. Bir io.Reader ve bir io.Writer verin ve her seferinde bir kerede küçük bir parça (örneğin, hepsi aynı anda bellekte değil) üzerinde veri kopyalar.

Böylece gibi bir şey yazmaya deneyebilirsiniz: Yukarıda test etmedim

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

; Sadece yukarıdaki örneğinizden çabucak birlikte hackledim, ama para olmasaydı yakın olmalıydı.

+0

Çok teşekkürler. İyi çalışıyor! – ekanna

+3

Bu kodun 'Close()' ifadelerinden birinin hata döndürmelerini kontrol etmediğini unutmayın. –

+3

@Nick, bu yüzden, ertelemek ve hatayı görmezden gelmek için oldukça yaygın (hatta deyimsiz). İşletim sistemindeki çığlık dışında genellikle bir hata üzerinde yapabileceğiniz fazla bir şey yoktur. – mna

İlgili konular