博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 详解defer
阅读量:6914 次
发布时间:2019-06-27

本文共 1720 字,大约阅读时间需要 5 分钟。

什么是defer

defer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体的"}"时调用。我们经常用他来做一些
资源的释放,比如关闭io操作
 
func doSomething(fileName string) {    file,err := os.Open(fileName)    if err != nil {    panic(err)    }    defer file.Close()}

 

defer 可以保证方法可以在外围函数返回之前调用。有点像其他言的 try finally
try{}finally{}

 

defer 读写外部变量

  defer声明的函数读写外部变量,和闭包差不多。比如下面的代码

func doSomething() {    v := 10    defer func() {        fmt.Println(v)        v++        fmt.Println(v)    }()    v += 5}

输出为

1516

  就像闭包一样,如果不是defer函数方法内的变量会向上一层函数访问变量,重新做计算。

defer 读写命名的返回值

    这个例子中,defer声明的方法,给命名的返回值自增1
 
1 func doSomething() (rev int) {2     defer func() {3         rev++4     }()5 6     return 57 }

  第6行的return 相当于

return rev = 5

  defer 声明的匿名函数会在return 之前执行,相当于

rev = 5// 执行defer方法rev++//然后returnreturn

  所以结果是6

  我把代码做一点点修改

1 func doSomething() (rev int) {2     v := 103     defer func() {4         v++5     }()6 7     return v8 }

  第7行返回的是局部变量v.   

return v 相当于 return rev = v

  defer 函数里是对局部变量v的操作,所以与返回的rev没有关系。所有执行的结果是:10

defer 执行顺序

当有多个defer时执行顺序逆向的,后进先出:
func doSomething() {    defer fmt.Println(1)    defer fmt.Println(2)}

 

会先输出2,再输出1
 

 defer 处理异常

  panic抛出异常后,如果不处理应用程序会崩溃。为了防止程序崩溃,我们可以在defer的函数里使用recover来捕获中异常:
func doSomething() {    defer func() {        if err := recover(); err != nil {            fmt.Print(err)        }            }()    fmt.Println("Running...")    panic("run error")}

输出:

Running...run error

recover 会捕获panic的异常。我再把代码做一点点修改:

func doSomething() {    defer func() {        if err := recover(); err != nil {            fmt.Print(err)        }            }()    defer func() {        panic("defer error")    }()    fmt.Println("Running...")    panic("run error")}

 

输出结果

Running...defer error

因为 recover()只捕获最后一次panic

 

转载地址:http://oyacl.baihongyu.com/

你可能感兴趣的文章
ABAP 面试问题及答案(一):数据库更新及更改 SAP Standard (转)
查看>>
Top 10 JavaScript编辑器,你在用哪个?
查看>>
数据访问层的优化思路
查看>>
饭后最该知道N件事
查看>>
MaxCompute Studio 2.8.1 新版本发布啦!
查看>>
《区块链原理、设计与应用》一2.5 认识上的误区
查看>>
当所有编程语言都在靠齐的时候
查看>>
苹果拥抱IBM背后:大数据推动手机行业洗牌
查看>>
无线广播可以毁灭物联网安全:信号干扰器及犯罪
查看>>
《并行计算的编程模型》一3.7.1 选择集合参与者
查看>>
百分点:利用大数据做智慧商业
查看>>
让你的软件永生的7个规则
查看>>
浅析自动化设备安装运维的发展方向
查看>>
2015年Facebook广告变现规模达10亿美金
查看>>
澳大利亚推出网安行业竞争力计划
查看>>
人类与机器人,如何能像朋友一样愉快聊天?
查看>>
2013云计算预测:攻击者馋涎云中数据
查看>>
中国最大漂浮式太阳能电站在安徽淮南落成
查看>>
关系数据库原理、数据模型
查看>>
日媒曝美的考虑收购东芝芯片业务,前者否认
查看>>