在閱讀了很多關于 go 中的讀取器/io.ReadWriter寫入器之后,我現在對如何實現讀?。ê妥柚梗┲钡剿粯擞洖橥瓿傻淖远x有點困惑。示例實現如下所示: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)一些相關問題:如何http.Response.Body將正文標記為已完成,因此io.Copy()知道何時停止閱讀?將其標記為已完成的最佳方法是什么?也許它也應該是io.Closer, 作為http.Response.Body?這些可能是愚蠢的問題,但在閱讀了一段時間后我無法解決它。也可能有更好的方法來實現這一點,我不知道。謝謝!
2 回答

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
如果您的目標是在一個 goroutine 中寫入并從另一個 goroutine 中讀取,那么使用io.Pipe:
r, w := io.Pipe()
go func(w io.WriteCloser) {
fmt.Fprintf(w, "Line one\n")
// ...more writes
w.Close()
}(w)
io.Copy(dst, r)
關閉管道的寫入側以指示寫入器已完成。
io.Reader 返回io.EOF以指示沒有更多數據可用。http 響應正文閱讀器在正文末尾返回 io.EOF。上面管道的讀取端在從寫入器返回所有數據后返回 io.EOF。

茅侃侃
TA貢獻1842條經驗 獲得超22個贊
首先,您是在制作自定義類型還是僅使用普通的 ReadWriter?
http.Response.Body 是一個 io.ReadCloser 所以 io.Copy 可以調用它的 Close()
為了表示結束,讓您的 ReadWriter 寫一個 io.EOF 來表示它已完成。你應該看看 ReadCloser(及其用法),所以也許你想要一個 io.ReadWriteCloser。
大概
Go 的庫代碼可讀性很強不要害怕點擊文檔中的函數查看實際源代碼。
- 2 回答
- 0 關注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消