package main
import "fmt"
func f1()(r int){
defer func(){
r++
}()
return 0
}
func f2()(r int){
t:=5
defer func(){
t=t+5
}()
return t
}
func f3()(r int){
defer func(r int){
r=r+5
}(r)
return 1
}
func main(){
fmt.Println("f1()=",f1())
fmt.Println("f2()=",f2())
fmt.Println("f3()=",f3())
}
执行结果:
一、f1()
r是函数的有名返回值,分配在栈上
操作 | r |
---|---|
return 0 | r=0 |
defer r=r+1 | r=1 |
二、f2()
t和r是相对独立的,在defer中对t的修改,不会影响r
操作 | r |
---|---|
t:=5,return t | r=5 |
defer t=t+5 | t=10,r=5 |
三、f3()
在f3()中执行defer时,func f3()(r int)使用了传参调用,在调用时会将r进行一次值拷贝r1传给函数做形参
操作 | r |
---|---|
return 1 | r=1 |
defer r1=r1+5 | r1=6,r=1 |
注意:在defer中修改返回值不是明智的选择,为了避免这种情况,通常在定义函数时使用不带返回值名的格式:
defer f4() int{//z只有返回值类型,无返回值名
}
通过这种方式defer就不能直接引用返回值的栈区(一、f1())