Golang 1.5 io.Copy 被两个 TCPConn 阻塞

Golang 1.5 io.Copy blocked with two TCPConn

http://play.golang.org/p/gZo5RqgY4F

我对 io.Copy 方法有疑问。上面的 link 将在 Go 1.5 的第 44 行中阻塞。但会在 1.4.2 中通过。我不知道这个问题。

这是我的 go 版本:go version go 1.5 darwin/amd64

Go 1.5 中的 io.Copy return 是什么时候?

以前,当系统调用的时间会在您的第二个 io.Copy [第 41 行] 中导致写入错误时,您会很幸运。 (忽略错误往往会隐藏错误)

这纯属偶然(甚至可能是不正确的)。由于该副本 (conn2) 的源连接永远不会关闭,因此 io.Copy 永远不会收到 io.EOF,也不会 return。您需要在每个复制 goroutine 中关闭相反的连接,以解锁对方对 io.Copy 的调用。

wg.Add(1)
go func() {
    io.Copy(conn1, conn2)
    // conn2 has returned EOF or an error, so we need to shut down the
    // other half of the duplex copy.
    conn1.Close()
    wg.Done()
}()

wg.Add(1)
go func() {
    io.Copy(conn2, conn1)
    conn2.Close()
    wg.Done()
}()