在Go语言中,err.(*os.PathError)是什么?

14

我在阅读 http://golang.org/doc/effective_go.html#errors 时,发现了这样一行代码:err.(*os.PathError)

for try := 0; try < 2; try++ {
    file, err = os.Create(filename)
    if err == nil {
        return
    }
    if e, ok := err.(*os.PathError); ok && e.Err == syscall.ENOSPC {
        deleteTempFiles()  // Recover some space.
        continue
    }
    return }

err.(*os.PathError)在Go语言中究竟是什么?

2个回答

24

os.Create返回的第二个返回值是一个错误。这个错误本身就是一个接口类型type error interface { Error() string }。任何恰好具有Error方法的数据类型都将实现该接口并可以被分配。

在大多数情况下,仅仅打印错误信息就足够了,但是在这个例子中,您希望明确处理ENOSPC(设备上没有剩余空间)。在这种情况下,os包将返回一个*os.PathError作为错误实现,如果您想访问关于错误的其他信息,即除Error() string之外的所有内容,您需要进行转换。

语句e,ok:= err.(*os.PathError)是一个类型断言。它将检查接口值err是否包含一个*os.PathError作为具体类型,并返回它。如果另一种类型存储在接口中(可能会有其他实现error接口的类型),那么它将简单地返回零值和false,也就是在这种情况下nil,false


7

来自文档,这是一个类型断言:

对于接口类型的表达式x和类型T,主要表达式为:

 x.(T)

断言 x 不是 nil 并且存储在 x 中的值是类型 T。x.(T) 的表示法称为类型断言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接