我正在从error
调用返回一个io.Copy
,我已将套接字(TCPConn
)传递到了该目标。期望远程主机在它们受够了之后会简单地断开连接,而我不会从他们那里收到任何信息。
发生下降时,出现此错误:
write tcp 192.168.26.5:21277: broken pipe
但是我只有一个error
接口。如何区分折断的管道错误和其他类型的错误?
if err.Errno == EPIPE...
管道破裂错误是在syscall软件包中定义的。您可以使用相等运算符将错误与syscall中的错误进行比较。检查http://golang.org/pkg/syscall/#constants以获取系统调用错误的完整列表。在页面上搜索“ EPIPE”,您将发现所有定义的错误分组在一起。
if err == syscall.EPIPE {
/* ignore */
}
如果您希望获得实际的errno值(尽管它几乎没有用,则可以使用类型断言:
if e, ok := err.(syscall.Errno); ok {
errno = uintptr(e)
}
从1.13版开始,您可以使用errors.Is代替类型断言。
if errors.Is(err, syscall.EPIPE) {
// broken pipe
}
error
接口以外的所有接口就足以执行类型声明或类型切换以显示该接口保留的具体类型。