Go 语言面试题
目录

Go 语言中 panic 和 recover 的用法?

· 约 3 分钟读完 · 第 50 / 175 章

推荐答案

在 Go 语言中,panic 和 recover 是用于处理程序中的异常情况的机制。panic 用于引发一个运行时错误,而 recover 用于捕获并处理这个错误,防止程序崩溃。

使用 panic

panic 是一个内置函数,用于引发一个运行时错误。当 panic 被调用时,程序会立即停止当前函数的执行,并开始逐层向上回溯调用栈,执行每个函数的 defer 语句,直到遇到 recover 或者程序崩溃。

使用 recover

recover 是一个内置函数,用于捕获 panic 引发的错误。recover 只能在 defer 函数中调用,并且只有在 panic 发生时才会生效。如果 recover 成功捕获了 panic,程序会继续执行,而不会崩溃。

本题详细解读

panic 的工作原理

  1. 引发错误:当 panic 被调用时,程序会立即停止当前函数的执行,并开始逐层向上回溯调用栈。
  2. 执行 defer:在回溯过程中,每个函数的 defer 语句会被执行。
  3. 程序崩溃:如果没有遇到 recover,程序最终会崩溃,并输出堆栈跟踪信息。

recover 的工作原理

  1. 捕获 panic:recover 只能在 defer 函数中调用,并且只有在 panic 发生时才会生效。
  2. 恢复执行:如果 recover 成功捕获了 panic,程序会继续执行,而不会崩溃。
  3. 返回值:recover 返回 panic 传递的值,如果没有发生 panic,recover 返回 nil。

使用场景

  • 错误处理:panic 和 recover 通常用于处理不可恢复的错误,例如内存不足、文件系统错误等。
  • 资源清理:在 defer 中使用 recover 可以确保在发生错误时,资源能够被正确释放。

注意事项

  • 不要滥用 panic:panic 应该用于处理真正的异常情况,而不是普通的错误处理。
  • recover 只能在 defer 中使用:如果在非 defer 函数中调用 recover,它将不会捕获 panic。
  • recover 不会捕获所有错误:recover 只能捕获由 panic 引发的错误,不能捕获其他类型的错误,例如 os.Exit 导致的程序退出。