当我在阅读时: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)
究竟是什么?
答案 0 :(得分:16)
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
。
答案 1 :(得分:7)