Golang defer函数内的变量问题

以下代码的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中跟着的其他逻辑。

猜你喜欢

转载自blog.csdn.net/weixin_52777294/article/details/114891495