当我在阅读时: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 }
Run Code Online (Sandbox Code Playgroud)
err.(*os.PathError)Go 究竟是什么?
tux*_*21b 17
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在那种情况下.
从文档中,这是一个类型断言:
对于接口类型的表达式x和类型T,主表达式
x.(T)
Run Code Online (Sandbox Code Playgroud)
声明x不是nil并且存储在x中的值是T类型.符号x.(T)称为类型断言.