Golang中的错误 – 评估错误。

huangapple go评论127阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2015年5月6日 07:56:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/30065194.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定