Go学习笔记:关于defer

anod · · 1204 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

有几个要点:

1、defer主要作用是用来做所谓的“善后”工作的,比如关闭文件、关闭网络连接、释放锁等等。有很多文章把defer放在异常处理中介绍,可能原因之一defer的出现极大改变了try-catch这种异常处理模式的复杂度(特别是嵌套的情况),代码变得更简洁了;

2、在一个Go函数中,允许有多个被defer的操作。这些操作按后进先出的方式,在函数return之前执行;

3、执行的顺序和时机:在一个函数中,无论有多少defer操作,无论它们的位置在哪儿,都会其它代码执行完毕,函数要return之前统一执行。如果将Go看成解释性语言的话,那么解释器会在遇到一个defer时将其后面的操作压入一个类似于堆栈的 数据结构中,并不马上执行。在遇到return时,再将堆栈中的所有defer操作来一遍“pop、执行、pop、执行......“,最后再return。


下面一段代码展示了执行顺序:


package main


import (
"fmt"
)


func work() (ret int) {
ret = -1
f := func(x int) {
ret = x
Log(ret)
}
Log(ret)
defer f(100)
Log(ret)
ret = -2
Log(ret)
defer f(1000)
Log(ret)
return
}


func Log(args ...interface{}) {
fmt.Println(args...)
}


func main() {
work()
}


执行的结果是:

-1
-1
-2
-2
1000
100


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:anod

查看原文:Go学习笔记:关于defer

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1204 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传