golang-defer误区 - Go语言中文社区

golang-defer误区


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())

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_34673519/article/details/100831047
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-02 18:58:50
  • 阅读 ( 830 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢