亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義閱讀器,直到遇到標記

自定義閱讀器,直到遇到標記

Go
忽然笑 2022-01-04 11:01:48
在閱讀了很多關于 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。


查看完整回答
反對 回復 2022-01-04
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

首先,您是在制作自定義類型還是僅使用普通的 ReadWriter?

  • http.Response.Body 是一個 io.ReadCloser 所以 io.Copy 可以調用它的 Close()

  • 為了表示結束,讓您的 ReadWriter 寫一個 io.EOF 來表示它已完成。你應該看看 ReadCloser(及其用法),所以也許你想要一個 io.ReadWriteCloser。

  • 大概

Go 的庫代碼可讀性很強不要害怕點擊文檔中的函數查看實際源代碼。


查看完整回答
反對 回復 2022-01-04
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號