net.Conn接口提供了SetTimeout方法,我应该用os.Timeout检查返回的错误。但是我看不到在返回的os.Error上调用os.Timeout的方法。
(我得到的os.Error是read unix @: Resource temporarily unavailable
,它似乎由两部分组成:超时函数的描述和strerror
的{{1}}描述.I已经尝试EAGAIN
并且它不起作用,可能是因为os.Error中的额外信息。)
答案 0 :(得分:1)
Go tutorial的“I / O包”部分包含以下代码段:
func OpenFile(name string, mode int, perm uint32) (file *File, err os.Error) {
r, e := syscall.Open(name, mode, perm)
if e != 0 {
err = os.Errno(e)
}
return newFile(r, name), err
}
syscall.Open()
有这个签名:
func Open(path string, mode int, perm uint32) (fd int, errno int)
所以我认为可以安全地假设os.Error
仍然只是整数错误代码,只是增加了绒毛并且你检查它的方法是正确的。
要调查为什么err == os.EAGAIN
不适合您,我会将错误打印为int
类型的值,然后将平台的errno.h
文件格式化为打印值。< / p>
答案 1 :(得分:0)
您需要执行type assertion。假设 kon 是net.Conn类型,你读入缓冲区 buf 。然后:
if numread, err := kon.Read(buf); err != nil {
if val, ok := err.(os.Errno); ok {
if val.Timeout() {
println("Connection to:", kon.RemoteAddr().String(), "timed out.")
}
}
}
这当然只是这个想法的要点。在实践中,你可能想要做一些更优雅的事情(也就是更多的RL complexleete),并使用Type switches一次考虑更多案例。