简明笔记:defer、panic、recover 详解。

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

## Go 简明笔记:defer 、恐慌panic、恢复recover 。 > Form 面向奶酪的简明笔记 # defer defer语句用来调用一个函数调用(被延期的函数),在执行defer的函数返回之前才会被执行。 常用来释放资源,会在函数返回之前进行调用。 举个栗子: ```go func main() { fmt.Println("1 Iron Man") fmt.Println("2 Iron Man") defer fmt.Println("main defer") foo1() } func foo1(){ defer fmt.Println("foo1 defer") fmt.Println("1 Spider Man") fmt.Println("2 Spider Man") } 输出结果: 1 Iron Man 2 Iron Man 1 Spider Man 2 Spider Man foo1 defer main defer ``` defer会在函数返回之前执行。 ## panic & recover ,恐慌与恢复。 panic():是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。 当在一个函数执行过程中调用 panic() 函数时,正常的函数执行流程将立即终止,但函数中 之前使用 defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致 逐层向上执行 panic 流程,直至所属的goroutine中所有正在执行的函数被终止。这一过程继续向上,直到程 序崩溃时的所有 goroutine 返回。 恐慌可以直接调用 panic 产生。也可以由运行时错误产生,例如访问越界的数组。 recover():是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。 Recover 仅在延迟函数中有效。 在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。如果当前 的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执 行。 recover 务必配合defer函数一起使用。 ```go package main import "fmt" func main() { fmt.Println("程序开始执行") defer func() { if msg:=recover();msg!=nil { fmt.Println("打印异常--->",msg) } }() pic() } func pic(){ fmt.Println("1") panic("panic...") fmt.Println("2") } 输出结果: 程序开始执行 1 打印异常---> panic... ```

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

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

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