自定义读取器,直到遇到标记为止



在阅读了很多关于go中读写器的内容后,我现在有点困惑于如何实现一个自定义的io.ReadWriter,它可以读取(和阻止),直到标记为已完成。示例实现如下所示:

var rw io.ReadWriter // my custom ReadWriter
// write to it in a non blocking way:
go func() {
    fmt.Fprintf(rw, "Line onen")
    // ...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中写入并从另一个gorroutine中读取,那么使用io.Pipe:

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

关闭管道的写入端,表示写入程序已完成。

操场示例

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

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

  • http.Response.Body是io.ReadCloser,因此io.Copy可以调用其Close()

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

  • 可能是

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

最新更新