如何在Go中比较errno?

问题描述

在Cgo中,您不能直接获取errno的值,但是可以在使用双返回值的函数调用之后获得errno的结果。例如ret,err := C.write(...)。但是,看来err只是一个不透明的错误接口,无法与errno常量进行比较。我该怎么办,例如像这样的东西:

ret,err := C.my_func()
if ret == -1 {
    // error signaled
    if err == C.EAGAIN {
        // do it again
    } else {
        return err
    }
} else {
    ...
}

代码invalid operation: err == _Ciconst_EAGAIN (mismatched types error and int)起不编译。这有可能吗?

解决方法

错误类型将为syscall.Errno,您可以断言并进行比较。

ret,err := C.my_func()
if errno,ok := err.(syscall.Errno); ret == -1 && ok {
    // error signaled
    if errno == C.EAGAIN {
        // do it again
    } else {
        return err
    }
}