go - 自定义阅读器直到遇到标记

标签 go

在阅读了很多关于 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)

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

playground example

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

关于go - 自定义阅读器直到遇到标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36577128/

相关文章:

json - Go结构类型的可变JSON结构映射

arrays - 无法访问在另一个函数中更改的结构字段

go - 将堆栈跟踪放入字符串变量

string - Golang 将字符串拆分并解析为不同的类型

struct - 如何导入特定于平台的结构?

c - Go cgo ldap_init 无法确定 C.ldap_init 的名称类型

go - 如何关闭来自另一个 goroutine 的读取 TCP 连接?

go - 如何编排并发请求-响应流程?

go - 为什么 golang 不能在我的带有范围的 for 循环中正确迭代?

golang-grpc 服务 - 从另一个文件导入类型