写入操作后获取errno

Unk*_*own 6 linux go

我有以下Go代码,它最终将填满磁盘并失败ENOSPC(只是一个概念证明).我如何从err返回的os.Write确定它确实失败因为ENOSPC(所以我需要一种方法来抓取errno写操作)?

package main

import (
    "log"
    "os"
)

func main() {
    fd, _ := os.Create("dump.txt")

    defer fd.Close()

    for {
        buf := make([]byte, 1024)

        _, err := fd.Write(buf)
        if err != nil {
            log.Fatalf("%T %v", err, err)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:更新程序为@FUZxxl建议:

package main

import (
    "log"
    "os"
    "syscall"
)

func main() {
    fd, _ := os.Create("dump.txt")

    defer fd.Close()

    for {
        buf := make([]byte, 1024)

        _, err := fd.Write(buf)
        if err != nil {

            log.Printf("%T %v\n", err, err)
            errno, ok := err.(syscall.Errno)

            if ok {
                log.Println("type assert ok")
                if errno == syscall.ENOSPC {
                    log.Println("got ENOSPC")
                }
            } else {
                log.Println("type assert not ok")
            }
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到预期的结果.这是输出:

2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device
2015/02/15 10:13:27 type assert not ok
Run Code Online (Sandbox Code Playgroud)

fuz*_*fuz 5

文件操作通常返回*os.PathError; 转换erros.PathError并使用该Err字段来检查根本原因,如下所示:

patherr, ok := err.(*os.PathError)
if ok && patherr.Err == syscall.ENOSPC {
    log.Println("Out of disk space!")
}
Run Code Online (Sandbox Code Playgroud)