golang defer讲解

来源:互联网 发布:mac 查看安装的程序 编辑:程序博客网 时间:2024/06/06 02:09

1.defer 是在函数退出前调用,多个defer遵循 先进后出 的原则调用;常用来做资源清理,关闭文件,解锁等操作

func deferTest() {defer func() {fmt.Println("func1...")}()func() {fmt.Println("func2...")}()defer func() {fmt.Println("func3...")}()}

2.defer调用所需参数在defer语句被压入栈中时获得(拷贝值),尽管defer语句是在函数返回前真正执行

func main() {x := 5defer fmt.Println("println=", x)defer func(y int) {fmt.Println("func=", y)}(x)x += 10fmt.Println(x)}
输出结果:
15
func= 5
println= 5

3.defer函数能够读取外围函数的返回值并进行更改操作

func main() {v := c()fmt.Println(v)}func c() (i int) {defer func() { i++ }()return 1}
输出结果:
2

以上代码c()函数可以解析为:

1.将defer函数压入栈中

2.给返回值i赋值为1,即i=1

3.执行defer函数,修改返回值i

4.执行空的return,即return;


4.看以下demo:

func main() {v := c()fmt.Println(v)}func c() (i int) {x := 1defer func(x int) { x++ }(x)return x}
输出结果:

1

上面函数c()这段代码可以解析为:

1.给变量x赋值为1

2.将defer函数压入栈中,同时拷贝变量x的值给defer函数中的x(注意:这是两个不同的x)

3.给返回值i赋值为x,即i = 1

4.执行defer函数,defer函数中的x为2(外围函数中的x值仍然为1)

5.执行return;

总结:

1.当执行到defer语句时,会先把它压入栈中,此时以值传递的方式获取defer语句所需要的参数,等它的外围函数返回前,开始按 先进后出 的原则执行defer语句

2.return xxx;语句并不是一个原子操作,当有defer语句时,return xxx可以解释为: 先给返回值赋值,然后执行defer语句,最后执行空的return。所以defer语句有可能更改返回值。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 王维诗词 送别王维 白居易的诗 王安石的诗 王维 送别 关于屈原的诗 范仲淹的诗 白居易诗 送别 王维 村居诗 村居的诗 有霸气的千古名诗 范仲淹脍炙人口的名诗 诩怎么读 诩怎么读音 诩读音 雾矢诩 小妖妻雾矢诩 展安宁傅诩爵 季白许诩 诩是什么意思 小妖妻雾失诩格格党 诩字在名字里好不好 三成贾诩据实回到为 率土之滨贾诩改版后暴走队2018 穿入全真教 司空诩 中华之帝国崛起 诩人 创意足球队名30个 世界名车 名车标志 名车 名车图片 名车排行榜 名车车标 三马名车 名车排名 德国名车 名车排行 名车大全 名车护理