在阅读了很多关于 go 中的读者/作者之后,我现在对如何实现自定义 io.ReadWriter
感到有点困惑,它读取(和阻塞)直到 被标记完成。示例实现如下所示:
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
?
这些问题可能很愚蠢,但我读了一段时间后还是无法理解。也可能有更好的方法来实现这个,我不知道。谢谢!
最佳答案
如果你的目标是在一个 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。
关于go - 自定义阅读器直到遇到标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36577128/