Golang中的defer、recover、panic

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

golang没有类似C中的try catch finlly,但是提供了defer revover panic

defer“延迟” 函数调用返回之前按照先进先出的顺序进行调用defer中的函数。

使用规则:1.defer函数中的参数值再定义时即进行计算。

func a() {
  i := 0
  defer fmt.Println(i)
  i++
  return
}

先进后出原则

func b() {
  for i := 0; i < 4; i++ {
  defer fmt.Print(i)
  }
}

可以读取并设置返回值

func c() (i int) {
  defer func() { i++ }()
  return 1
}

panic "恐慌"函数执行时,意味着函数进入恐慌模式,抛出异常。如果函数有panic函数执行,则想上一层调用者返回panci信息,上一层也按照此逻辑执行,如果goroutine没有处理panic信息,则goroute会异常崩溃,如果是主goroute,则程序崩溃。

#

recover“恢复”用于处理panic抛出的异常信息

package main
import "fmt"
func main() {
    f()
    fmt.Println("Returned normally from f.")
}
func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    fmt.Println("Calling g.")
    g(0)
    fmt.Println("Returned normally from g.")
}
func g(i int) {
    if i > 3 {
        fmt.Println("Panicking!")
        panic(fmt.Sprintf("%v", i))
    }
    defer fmt.Println("Defer in g", i)
    fmt.Println("Printing in g", i)
    g(i + 1)
}
其输出结果为:
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.

作者:CodingTech
链接:http://www.jianshu.com/p/f76b9ce083c4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

本文来自:简书

感谢作者:我是不是小明

查看原文:Golang中的defer、recover、panic

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

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