如何从os.Error获取os.Errno?使用os.Timeout的其他方法?

时间:2011-10-29 13:51:39

标签: sockets error-handling go

net.Conn接口提供了SetTimeout方法,我应该用os.Timeout检查返回的错误。但是我看不到在返回的os.Error上调用os.Timeout的方法。

(我得到的os.Error是read unix @: Resource temporarily unavailable,它似乎由两部分组成:超时函数的描述和strerror的{​​{1}}描述.I已经尝试EAGAIN并且它不起作用,可能是因为os.Error中的额外信息。)

2 个答案:

答案 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一次考虑更多案例。