本文是在看Effective GO 时记录的,因为对defer panic recover 平时用的不多,所以感悟不是很深,便先记下来,在以后的实践中慢慢深入
Defer, Panic and Recover
- 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)
- panic
- recover: regain control of a panicking goroutine.
defer recover()
panic()
先defer recover后,在panic终止函数后,recover执行,获取panic的值,并且恢复程序正常执行