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开始执行一些收尾工作;最后函数携带当前返回值退出。"
*/
}
资料来源:https://www.cnblogs.com/saryli/p/11371912.html