以下代码的defer函数内的print会被执行吗?
package main
import (
"errors"
"fmt"
)
func Foo(n int64) (err error) {
defer func() {
if err != nil {
fmt.Println("error in defer is :", err)
}
}()
if n <= 0 {
return errors.New("n <= 0")
}
return nil
}
func main() {
Foo(-1)
}
可借助GoLand的DEBUG功能设置如图所示的几个断点来跟踪下程序执行顺序
通过调试可以看到,代码执行顺序为代码块 2 —> 3 —> 4 —> 5(其中标记为1
的地方只是个声明一个defer函数,并没有开始执行)
其中第二步执行完会自动给函数返回值err赋值,所以第四步执行的时候,err不是nil,所以defer内的print会被执行。
通过上面的例子我们也可以仔细思考下“defer函数在return之前执行”这句话。
其中提到的return只是return关键字,而不包含return中跟着的其他逻辑。