【发布时间】:2017-03-09 19:18:51
【问题描述】:
我正在学习 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 表示在评估 defer 调用时评估参数,这似乎应该是一致的。为什么 2 defer 对变量 err 有不同的值,因此输出不同?我知道它与第二个函数有关,将err 作为输入参数,但不知道为什么。
【问题讨论】:
标签: go error-handling deferred