Go学习——defer、panic

defer:

延迟到ret之前,通常用于IO的关闭 or 错误处理。
在延迟出现的异常可以被后面的捕捉,但是只有最后一个。
defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时将先被调用

func f() (result int) {
  deferfunc()
  {
    result++
  }()
  return 0

}

func test() error {
  f, err := os.Create("test.txt")
  if err != nil { return err }
  defer f.Close() // 注册调⽤用,⽽而不是注册函数。必须提供参数,哪怕为空。
  f.WriteString("Hello, World!")
  return nil
}

panic:

函数执行的时候panic了,函数不往下走了,运行时并不是立刻向上传递panic,而是到defer那,等defer的东西都跑完了,panic再向上传递。

func panic(v interface{})
func recover() interface{}

defer recover()  //无法捕捉

所以可以在defer中用recover进行抓捕。
而且recover必需在延迟调用内才行。


参考:

http://www.cnblogs.com/ghj1976/archive/2013/02/11/2910114.html
https://github.com/qyuhen/book

posted @ 2017-05-06 13:48  Przz  阅读(294)  评论(0编辑  收藏  举报