defer 的常用场景
Posted linyihai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了defer 的常用场景相关的知识,希望对你有一定的参考价值。
将panic的转化为error类型值,并将其作为函数值返回给调用方
package main
import "fmt"
func divide(a, b int) (res int, err error) {
defer func() {
if rec := recover(); rec != nil {
err = fmt.Errorf("%s", rec)
}
}()
res = a / b
return
}
func main() {
res, err := divide(1, 0)
fmt.Println(res, err) // 0 runtime error: integer divide by zero
res, err = divide(2, 1)
fmt.Println(res, err) // 2 <nil>
}
保证sync.Mutex同步锁得到解锁
var mux sync.Mutex
mux.Lock()
defer mux.Unlock() //注意这里Lock和Unlock是紧挨在一起的,使用defer语句保证Unlock方法一定调用,中间不要加入其他代码,防止发生panic,defer语句没有执行到
以上是关于defer 的常用场景的主要内容,如果未能解决你的问题,请参考以下文章
ReactiveSwift源码解析 Atomic的代码实现以及其中的Defer延迟Posix互斥锁递归锁