使用net.Pipe的Golang io.Reader用法

时间:2016-09-06 17:53:22

标签: go

我试图解决的问题是在网络应用程序中使用io.Reader和io.Writer而不使用bufio和字符串,这是我在网上找到的例子。为了提高效率,我试图避免那些隐含的memcopys。

我在游戏区域(https://play.golang.org/p/-7YDs1uEc5)上使用net.Pipe创建了一个测试应用程序。有一个数据源和接收器通过net.Pipe连接对(用于建模网络连接)和远端的环回进行通信,以反映我们的数据。

程序获取环回代理读取发送数据的程度,但据我所知,写回连接锁;它肯定永远不会完成。此外,接收器中的接收器从不接收任何数据。

我无法弄清楚为什么写入不能继续进行,因为它与完成工作的路径完全对称。我已经编写了其他使用双向网络连接的测试系统,但是一旦我停止使用bufio和ReadString,我就遇到了这个问题。我看了那些代码,看不出我错过了什么。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题出在第68行:

data_received := make([]byte, 0, count)

此行创建一个长度为0且容量为count的切片。对Read的调用不会读取数据,因为长度为0.对Write的调用因为永远不会读取数据而阻塞。

通过将行更改为:

来解决此问题
data_received := make([]byte, count)

playground example

请注意,可能无法打印“完成写入”,因为程序可以在dataSrc完成执行之前退出。