在阅读了很多关于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的库代码非常可读。不要害怕点击文档中的函数来查看实际的源代码。