2016-04-12 13 views
0

karşılaşıldığında, şimdi bitmiş gibi işaretlenir kadar okur özel io.ReadWriter (ve bloklar) nasıl uygulanacağı konusunda biraz kafam karıştı. Örnek bir uygulama aşağıdaki gibi görünür:Özel okuyucu seferde okuyucular/yazarlar hakkında çok şey okuduktan sonra

var rw io.ReadWriter // my custom ReadWriter 

// write to it in a non blocking way: 
go func() { 
    fmt.Fprintf(rw, "Line one\n") 
    // ...more writes 
    fmt.Fprintf(rw, "END") // what would be best to mark the writer as finished??? 
}() 

// read from it and block until **encountering finish mark??** 
_, _ = io.Copy(dst, rw) 

ilgili bazı sorular:

http.Response.Body bitmiş olarak vücudu işaretler nasıl
  • yüzden io.Copy() zaman okumayı durdurmak için bilir?
  • Son olarak işaretlemenin en iyi yolu ne olurdu?
  • Belki de http.Response.Body olarak io.Closer olmalıdır?

Bunlar saçma sorular olabilir ama bir süreliğine okuduktan sonra kafamın etrafına dolamıyorum. Bunu uygulamak için daha iyi bir yol olabilir, bilmiyorum. Teşekkürler!

cevap

1

, daha sonra bir io.Pipe kullanın.

playground example

Bir io.Reader artık veriler olduğunu belirtmek için io.EOF döndürür. Http yanıtı vücut okuyucusu, vücudun sonunda io.EOF değerini döndürür. Yukarıdaki borunun okunan tarafı, yazardan tüm verileri döndükten sonra io.EOF değerini döndürür.

0

İlk önce, özel bir yazı mı yapıyorsunuz yoksa sadece normal bir ReadWriter kullanıyor musunuz?

  • http.Response.Body bir io.ReadCloser yüzden io.Copy çağırabilir onun Yakın()

  • , sonunu işaret senin ReadWriter bir io.EOF Bittikten sinyal yazmasını sağlamak için . ReadCloser'a (ve onun kullanımlarına) bir göz atmalısınız, bu yüzden belki bir io.ReadWriteCloser istersiniz.
  • Muhtemelen

Go kitaplığındaki kod gerçek kaynağına bakmak için belgelerinde fonksiyonları üzerine tıklayın korkmayın çok okunabilir olduğunu.

r, w := io.Pipe() 
go func(w io.WriteCloser) { 
    fmt.Fprintf(w, "Line one\n") 
    // ...more writes 
    w.Close() 
}(w) 
io.Copy(dst, r) 

Kapat borunun yazma yan yazarı yapıldığını belirtmek için: Hedefiniz bir goroutine yazmak ve başka okuma ise

İlgili konular