我正在学习 defer 在 golang 中的行为方式,并想用它来处理函数返回时的错误。
代码如下:
package main
import "fmt"
import "errors"
func main() {
a()
}
func a() {
var err error
defer func(){
if err != nil {
fmt.Printf("1st defer: %s\n", err)
} else {
fmt.Println("1st defer: defer not error")
}
}()
defer func(err error){
if err != nil {
fmt.Printf("2nd defer: %s\n", err)
} else {
fmt.Println("2nd defer: defer not error")
}
}(err)
err = errors.New("new error")
if err != nil {
return
}
}
输出:
2nd defer: defer not error
1st defer: new error
Doc https://blog.golang.org/defer-panic-and-recover说在评估延迟调用时评估参数,这似乎应该是一致的。为什么 2 defer 的变量值不同err
从而产生不同的输出?我知道它与第二个功能有关err
作为输入参数,但不知道为什么。
好吧,我刚刚想通了。如果将任何参数传递给 defer 函数(如上面的第二个 defer 函数),这些参数在 defer 函数被延迟时评估,而不是在执行时评估。这意味着在我的例子中err
还是nil
并且尚未分配给新错误。
另一方面,在上面的第一个延迟中,err
不是参数,而是函数中的变量a
,并且当执行第一个 defer 时,它已经被分配给一个新的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)