Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 从PathError中获取errno值的正确方法_Go_Error Handling - Fatal编程技术网

Go 从PathError中获取errno值的正确方法

Go 从PathError中获取errno值的正确方法,go,error-handling,Go,Error Handling,我正在尝试确定os.PathError是否是由于EINVAL或enoint造成的。我怎样才能正确地做出决定 res, err := os.Readlink(fpath) if err, ok := err.(*os.PathError); ok { if err.Err == os.ErrInvalid { // This path here. What's the correct check? return fp

我正在尝试确定
os.PathError
是否是由于
EINVAL
enoint
造成的。我怎样才能正确地做出决定

    res, err := os.Readlink(fpath)

    if err, ok := err.(*os.PathError); ok {
        if err.Err == os.ErrInvalid {
            // This path here. What's the correct check?
            return fpath
        }
        log.Printf("ResolveLinks error: %s", err)
        return ""
    }
    log.Printf("Resolved: %s to %s", fpath, res)
    return res
如果
fpath
指向常规文件而不是符号链接,则readlink应生成
EINVAL
,但my
err.err==os.ErrInvalid
检查失败,并记录以下内容:

2019/03/28 12:04:42解析链接错误:readlink foo:无效参数

我应该把PathError解包,但那又怎么样?比较错误字符串


我注意到操作系统模块有一些功能来匹配错误类型,比如,但是我没有看到所有可能的错误代码都有一个

我发现错误的字符串允许匹配错误类型,但我(根本)不相信这能跨平台甚至跨地区工作

if err, ok := err.(*os.PathError); ok {

    //EINVAL
    if err.Err.Error() == "invalid argument" {
        …

    // - OR - 

    //ENOENT
    if err.Err.Error() == "no such file or directory" {
       …
}

err.err
类型为
syscall.Errno
,这是可以转换为int的整数类型。在Ubuntu上运行此代码会产生错误代码22:

    if serr, ok := err.Err.(syscall.Errno); ok {
        fmt.Println(int(serr))
    }
请记住,我不知道这种支票是否是跨平台的

如果您只想检查file is symlink,可以使用获取
FileInfo
struct并进行检查:

fi.Mode() & os.ModeSymlink != 0

谢谢错误对象似乎被定义为
syscall
模块中的全局常量,因此只需执行
err.err==syscall.EINVAL
即可工作并避免额外的类型推断。感谢您提供的检查文件类型的技巧,但我更愿意执行一次系统调用并在那里执行错误检查,这也减少了在两次调用之间文件发生更改的竞争条件的机会(虽然很小)。是的,这比检查int值要好:d