golang 测试 defer 与 return 与返回值预先命名之间的关系
package main import "fmt" // 测试 defer 与 return 与返回值预先命名之间的关系 func test1() int { var a int defer func() { a++ fmt.Println("defer one in data a = ",a) }() defer func() { a++ fmt.Println("defer one in data a = ",a) }() return a } func test2() (a int) { defer func() { a++ fmt.Println("defer two in data a = ",a) }() defer func() { a++ fmt.Println("defer two in data a = ",a) }() return } func test3() int { var a int defer func() { a++ fmt.Println("defer three in data a = ",a) }() defer func() { a++ fmt.Println("defer three in data a = ",a) }() a+=10 return a } func test4() (a int) { defer func() { a++ fmt.Println("defer forty in data a = ",a) }() defer func() { a++ fmt.Println("defer forty in data a = ",a) }() a+=10 return } func test5() int { var a int defer func(a int) { a++ fmt.Println("defer five in data a = ",a) }(a) defer func(a int) { a++ fmt.Println("defer five in data a = ",a) }(a) a+=10 return a } func main() { fmt.Println(test1()) fmt.Println(test2()) fmt.Println(test3()) fmt.Println(test4()) fmt.Println(test5()) /* defer one in data i = 1 defer one in data i = 2 0 defer two in data i = 1 defer two in data i = 2 2 defer three in data i = 11 defer three in data i = 12 10 defer forty in data i = 11 defer forty in data i = 12 12 defer five in data a = 1 defer five in data a = 1 10 result: 如果函数返回值预先设置了, 返回的值会根据defer的操作进行给改变 如果函数返回值实在内部定义,则返回的数据不会随defer中操作变化 test5 表示方法从上至下执行, 初始化一个变量a,defer 压入栈中(两个defer中a=0) 返回10,表示return先与defer先执行 "defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。" */ }