我想了解以下示例
https://gobyexample.com/errors
除了这一部分,我理解其中的大部分内容:
_, e := f2(42)
if ae, ok := e.(*argError); ok {
fmt.Println(ae.arg)
fmt.Println(ae.prob)
}
我不确定这条线的作用:
if ae, ok := e.(*argError); ok {
答案 0 :(得分:4)
e.(*argError)
是一个类型断言,它将值e转换为* argError类型。这是类型f2()返回错误 - 它是一个指向argError结构的指针,它实现了错误接口。此类型断言将多值计算为(ae,ok),其中ae是* argError类型值,如果成功,则ok是布尔值,让您知道它是否成功。
如果go中的语句可以分为初始赋值部分,然后是分号,则需要一个布尔条件来评估以确定分支。
然后,
if ae, ok := e.(*argError); ok {
表示:尝试将e转换为* argError,如果成功则执行(如果阻止则执行)。
为什么这样?因为argError具有不在普通错误(arg,prob)中的字段,并且您可能希望使用这些字段。在您执行此操作的实际代码中,您可能还需要在“else”分支中处理e不是argError但是其他一些错误类型的情况。