自定义阅读器,直到遇到标记

时间:2016-04-12 15:03:21

标签: go

在阅读了很多有关读者/作者的内容之后,我现在对如何实现读取(和阻止)的自定义io.ReadWriter感到有点困惑,直到将其标记为已完成< / strong>即可。示例实现如下所示:

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.Closerhttp.Response.Body

这些可能是愚蠢的问题,但在阅读一段时间后我无法绕过它。也许有更好的方法来实现这一点,我不知道。谢谢!

2 个答案:

答案 0 :(得分:1)

如果你的目标是写一个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)

关闭管道的写入侧以指示编写器已完成。

playground example

io.Reader返回io.EOF表示没有更多数据可用。 http响应体读取器返回身体末端的io.EOF。上面管道的读取端在从写入器返回所有数据后返回io.EOF。

答案 1 :(得分:0)

首先,您是在制作自定义类型还是只使用普通的ReadWriter?

  • http.Response.Body是一个io.ReadCloser,所以io.Copy可以调用它的Close()

  • 要发出结束信号,请让您的ReadWriter写一个io.EOF来表示它已经完成。你应该看看ReadCloser(及其用法),所以也许你想要一个io.ReadWriteCloser。

  • 可能

Go的代码非常可读,不要害怕点击文档中的功能来查看实际来源。