11

当我阅读时: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 中到底是什么?

4

2 回答 2

22

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

在大多数情况下,仅打印错误就足够了,但在此示例中,您希望ENOSPC显式处理(设备上没有剩余空间)。在这种情况下,该os包返回一个*os.PathErroras 错误实现,如果您想访问有关错误的其他信息,即Error() string, 方法旁边的所有内容,则必须对其进行转换。

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

于 2013-08-20T17:09:03.063 回答
7

docs来看,这是一个类型断言:

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

 x.(T)

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

于 2013-08-20T16:43:59.817 回答