在我的golang程序中,我使用io.Copy()
中继end1和end2之间的流。
func relay(src, dst net.Conn, stop chan bool) {
stop <- (io.Copy(src, dst) == nil)
}
func myprog(e1, e2 net.Conn) {
stop := make(chan bool)
go relay(e1, e2, stop)
go relay(e2, e1, stop)
result := <-stop
// Which end causes failure? Or both of them?
}
当其中一个继电器发生故障时,我如何找出哪一端闭合/掉线。结果呢?还是调用e1/e2的某些成员函数?谢谢。
最佳答案
首先,使两个relay
共享一个 channel 并返回一个错误,但不提供有关其来自哪个relay
的信息,这显然无助于了解哪个端点出了问题。
其次,您可以包装每个端点的Read和Write方法来通知错误,例如:
type errReader struct {
r io.Reader
err error
}
func (er *errReader) Read(b []byte) (int, error) {
n, err := er.r.Read(b)
er.err = err
return n, err
}
type errWriter struct {
w io.Writer
err error
}
func (ew *errWriter) Write(b []byte) (int, error) {
n, err := ew.w.Write(b)
ew.err = err
return n, err
}
注意:上面的代码既不考虑并发读写,也不考虑错误后的继续(可能将err值再次设置为nil),尽管它对io.Copy
来说不是问题。它还不会忽略io.EOF
错误,因此您可能需要显式检查它。
关于go - 是否有可能找出导致io.Copy失败的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64832039/