defer是Go语言的一种特殊的流程控制机制,通常用于简化执行各种资源清理和释放操作,比如关闭文件,释放锁,断开连接等等。使用defer可以更加简洁清晰的实现这种清理操作,但同时就像任何事物都有两面性,这种简洁性有时也会带来性能的下降,有些场景因此应该避免使用defer。本文主要是关于对应于不同的场景,如何选择性得正确得使用defer。
defer概念
下面的叙述中,统一用外围函数代指包含defer的外层函数
defer语句调用一个函数,该函数的执行被推迟到外围函数返回的那一刻,外围函数的返回存在两种情况:正常执行到了return语句 或者 函数所在的goroutine发生了崩溃(panic)。也就是说如果外围函数通过显式return语句返回,defer语句真正执行的时机则是在该return语句设置任何结果参数之后,但在外围函数返回其调用者之前。