【问题标题】:What is err.(*os.PathError) in Go?Go 中的 err.(*os.PathError) 是什么?
【发布时间】:2013-08-24 05:52:47
【问题描述】:

阅读时: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 }

Go 中的 err.(*os.PathError) 到底是什么?

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

       x.(T)
      

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

      【讨论】:

        猜你喜欢
        • 2012-05-12
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        相关资源
        最近更新 更多