我有一个函数返回Reader
的{{1}}结尾并启动一个go-routine,它将数据写入io.Pipe
端,然后关闭管道。
Writer
https://play.golang.org/p/OAijIwmtRr
这似乎总是在我的测试中起作用,因为我得到了我写的所有数据。但API docs对我来说有点担心:
func Pipe()(* PipeReader,* PipeWriter)
Pipe创建一个同步的内存中管道。 [...]一端读取是 与另一方的写作相匹配,[...]没有内部 缓冲。
func(w * PipeWriter)CloseWithError(错误错误)错误
CloseWithError关闭编写器;随后从读取的一半读取 管道将返回没有字节和错误错误,如果错误是,则返回EOF 为零。
我想知道的是,这里可能的竞争条件是什么?有可能我的go-routine会写一堆数据然后关闭管道然后才能读出来吗?
我是否需要使用通道来关闭何时关闭?什么可能出错,基本上。
答案 0 :(得分:3)
不,没有竞争条件。正如文档中提到的那样,一端的读取与另一端的写入匹配。因此,当达到CloseWithError()
时,表示每个Write
已成功完成并与相应的Read
匹配 - 因此另一端必须已阅读所有要阅读的内容。