在阅读了很多有关读者/作者的内容之后,我现在对如何实现读取(和阻止)的自定义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.Closer
,http.Response.Body
?这些可能是愚蠢的问题,但在阅读一段时间后我无法绕过它。也许有更好的方法来实现这一点,我不知道。谢谢!
答案 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)
关闭管道的写入侧以指示编写器已完成。
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的代码非常可读,不要害怕点击文档中的功能来查看实际来源。