英文:
Errors in Golang - assessing errors
问题
我正在尝试理解以下示例: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 {
这行代码是一个类型断言(type assertion)的语法。它的作用是将变量e转换为类型*argError,并将结果赋值给变量ae。如果转换成功,ok的值为true,否则为false。
在这个例子中,argError是一个自定义的错误类型。通过这个类型断言,我们可以检查e是否是argError类型的实例。如果是,我们可以访问ae的字段,如ae.arg和ae.prob。
希望这能帮助你理解这段代码的含义。如果还有其他问题,请随时提问。
英文:
I am trying to understand the following example
https://gobyexample.com/errors
I understand most of it except for this part:
_, e := f2(42)
if ae, ok := e.(*argError); ok {
fmt.Println(ae.arg)
fmt.Println(ae.prob)
}
I'm not sure what this line does :
if ae, ok := e.(*argError); ok {
答案1
得分: 7
e.(argError)是一种类型断言,将值e转换为argError类型。这是f2()在出现错误时返回的类型-它是指向argError结构体的指针,该结构体实现了error接口。这种类型断言会将多值评估为(ae, ok),其中ae是*argError类型的值(如果成功),ok是一个布尔值,用于告诉您是否成功。
在Go中,if语句可以分为初始赋值部分,然后是一个分号,然后是一个布尔条件来确定分支。
综上所述,
if ae, ok := e.(*argError); ok {
的意思是:尝试将e转换为*argError类型,如果成功(执行if块)。
为什么要这样做?因为argError具有不在普通error中的字段(arg,prob),您可能希望使用这些字段。在实际代码中,您可能还需要处理e不是argError而是其他错误类型的情况,在"else"分支中处理该情况。
英文:
e.(*argError)
is a type assertion that casts the value e to *argError type. This is the type f2() returns on error - it is a pointer to an argError struct, which implements the error interface. This type assertion evaluates multi-valued to (ae,ok), where ae is the *argError typed value, if successful, and ok is a boolean letting you know if it was successful.
if statements in go can be separated into an initial assignment part, then a semicolon, then a boolean condition to evaluate to determine the branch.
Altogether, then,
if ae, ok := e.(*argError); ok {
means: try to cast e to *argError, if that is successful (do if block).
Why do this? Because argError has fields that are not in a plain error (arg, prob), and you might want to use those. In real code where you do this, you'd likely also need to handle the case where e was not an argError, but some other error type, in an "else" branch.
答案2
得分: 0
在'类型断言'中添加Go官方链接:
类型断言提供对接口值的底层具体值的访问。
t := i.(T)
该语句断言接口值i持有具体类型T,并将底层的T值赋给变量t。
如果i不持有T,则该语句将触发恐慌。
为了测试接口值是否持有特定类型,类型断言可以返回两个值:底层值和一个布尔值,报告断言是否成功。
t, ok := i.(T)
如果i持有T,则t将是底层值,ok将为true。
如果不是,则ok将为false,t将是类型T的零值,并且不会发生恐慌。
请注意,此语法与从映射中读取的语法相似。
英文:
Add Go official link here on 'Type assertions':
A type assertion provides access to an interface value's underlying concrete value.
t := i.(T)
This statement asserts that the interface value i holds the concrete type T and assigns the underlying T value to the variable t.
If i does not hold a T, the statement will trigger a panic.
To test whether an interface value holds a specific type, a type assertion can return two values: the underlying value and a boolean value that reports whether the assertion succeeded.
t, ok := i.(T)
If i holds a T, then t will be the underlying value and ok will be true.
If not, ok will be false and t will be the zero value of type T, and no panic occurs.
Note the similarity between this syntax and that of reading from a map.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论