當(dāng)我閱讀開源代碼時:下面有這段代碼:streamConn := func(dst io.Writer, src io.Reader) { io.Copy(dst, src) streamWait.Done() } go streamConn(remoteConn, conn) go streamConn(conn, remoteConn)你看到那里使用兩個go streamConn()在兩個之間切換數(shù)據(jù)conn。我想知道如果remoteConn沒有數(shù)據(jù)傳輸,那里復(fù)制什么?復(fù)制nil?
1 回答
哈士奇WWW
TA貢獻1799條經(jīng)驗 獲得超6個贊
通常網(wǎng)絡(luò)套接字在阻塞模式下運行——如果沒有更多的數(shù)據(jù)要接收,那么“接收”操作將坐在那里等待,直到有數(shù)據(jù)為止。這就是為什么有兩個 goroutine,每個方向一個——這樣一個可以繼續(xù)復(fù)制數(shù)據(jù),而另一個仍在等待數(shù)據(jù)(讀取時阻塞)。
對于一個類似但更直接的示例,您會發(fā)現(xiàn)在同一文件中直接調(diào)用remoteConn.Read(data)了更高的位置。調(diào)用時,Read() 將不會返回,直到它獲得一些數(shù)據(jù) – 或者直到它達到使用 SetReadDeadline() 設(shè)置的超時(在這種情況下它將通過 返回超時錯誤err)。
- 1 回答
- 0 關(guān)注
- 95 瀏覽
添加回答
舉報
0/150
提交
取消
