当我阅读开源代码时:
有如下代码:
streamConn := func(dst io.Writer, src io.Reader) {
io.Copy(dst, src)
streamWait.Done()
}
go streamConn(remoteConn, conn)
go streamConn(conn, remoteConn)
你可以看到这里使用两个go streamConn()
在两个conn
之间切换数据。我想知道如果remoteConn
没有数据传输,那里复制什么?copynil
?
通常网络套接字以阻塞模式运行-如果没有更多的数据要接收,则"接收";操作只会让坐在那里等待直到有一些。这就是为什么有两个例程,一个在一个方向上——这样一个可以继续复制数据,而另一个仍然在等待数据(读取时阻塞)。
对于一个类似但更直接的示例,您将在同一文件中找到对remoteConn.Read(data)
的直接调用。当被调用时,Read()将不会返回,直到它获得一些数据-或者直到它达到上面使用SetReadDeadline()设置的超时(在这种情况下,它将通过err
返回timeout错误)。