Go中如何比较errno?

How to compare errno in Go?

在Cgo中,你不能直接获取errno的值,但是你可以使用double return值调用一个函数后得到它的结果。例如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
    }
}