defer
能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer
与 panic
和 recover
结合,形成了Go语言风格的异常与捕获机制。defer 语句经常被用于处理成对的操作,如文件句柄关闭、连接关闭、释放锁。虽然 defer 方便开发者使用,但是也有一定的性能损耗。
函数退出前,按照先进后出的顺序,执行 defer 函数。panic 后的 defer 函数不会被执行(遇到 panic,如果没有捕获错误,函数会立刻终止)。panic 没有被 recover 时,抛出的 panic 到当前 goroutine
最上层函数时,最上层程序直接异常终止。
实现原理:
将 defer 函数直接插入到函数的尾部,无需链表和栈上参数拷贝,性能大幅提升。把 defer 函数在当前函数内展开并直接调用,这种方式被称为 open coded defer
。