go语言,defer 后面跟匿名函数和非匿名函数的区别

package main

import "fmt"

func main() {
	a := 1
	b := 2
	c := add(a, b)
	fmt.Printf("end! c=>%d\n", c)
}

// a+b
func add(a, b int) (c int) {
	c = a + b //此时,c=3

    //两个defer,分别打开注释,看区别
	//defer printC(addC(c))   
	//defer func() {
	//	c = printC(addC(c))
	//}()

	fmt.Printf("return! c=>%d\n", c)
	return c
}

// 打印c
func printC(c int) int {
	fmt.Printf("printC! c=>%d\n", c)
	return c
}

// c=c+1
func addC(c int) int {
	c++
	fmt.Printf("addC! c=>%d\n", c)
	return c
}

上面的defer,打印结果:

go语言,defer 后面跟匿名函数和非匿名函数的区别_第1张图片

下面的defer,打印结果:

go语言,defer 后面跟匿名函数和非匿名函数的区别_第2张图片

结论

return和defer的执行顺序:

1. 返回值赋值给c;

2. 调用defer表达式;

3. 返回给调用函数。

defer只是把最外一层函数体放在最后执行,其他的都是先执行。

1. 上面的defer,最外一层函数是printC,addC只是参数并不在printC函数体内,所以printC放在最后执行,addC按照正常顺序执行;

2. 下面的defer,最外一层是匿名函数,里面的printC和addC都是在匿名函数内部,所以整体都是最后执行。

你可能感兴趣的:(go,golang,defer,匿名函数,func)