Go 基础(3)Defer ,Panic and Recover | 青训营

61 阅读1分钟

本文是在看Effective GO 时记录的,因为对defer panic recover 平时用的不多,所以感悟不是很深,便先记下来,在以后的实践中慢慢深入

Defer, Panic and Recover

  1. defer

A defer statement pushes a function call onto a stack(FILO). The stack of saved calls is executed after the surrounding function returns. 先return,再execute defer

defer 三个注意事项

  • A deferred function`s arguments are evaluated when the defer statements is evaluted.

被延迟的函数中的实参,在evaluate的时候就执行了,而不是在execute的时候

这里defer 函数有两个阶段:一个是evaluated ,另一个是execute。 evaluate是指程序走到defer这句的时候,execute是在函数return之后,调用被延迟的函数

func a(){
  i := 0
  defer fmt.Println(i)
  i++
  return
}
// 输出的是0 
  • Deffered function calls are executed in Last In First Out order after the surrounding function returns.

多个defer函数是采用先进后出的类似栈的形式

func b(){
    for i :=range(0,4){
        defer fmt.Println(i)
    }
}
// "3 2 1 0"
  • Deffered functions may read and assign to returning function`s named return values.

延迟的函数是会对返回值产生影响的

func c()(i int){
    defer func(){i++}
    return 1
}
//print(2)
  1. panic
  2. recover: regain control of a panicking goroutine.

defer recover()

panic()

先defer recover后,在panic终止函数后,recover执行,获取panic的值,并且恢复程序正常执行