golang panic 函数用法示例详解

 更新时间:2025年03月01日 15:49:26   作者:学会了没  
在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在defer函数中捕获panic,恢复程序流程,建议优先返回error,仅在严重错误或不可恢复场景下使用panic,并在关键位置recover,感兴趣的朋友一起看看吧

在 Go 语言中,panicrecover 是用于处理运行时异常的关键字。以下是它们的用法总结和示例:

1. panic 的作用

  • 触发条件:当程序遇到无法恢复的严重错误时(如不可预料的逻辑错误、依赖项缺失等),panic 会终止当前函数的执行,并逐层向上触发 defer,最后若未被 recover 捕获,程序会崩溃。
  • 适用场景
    • 初始化阶段的关键资源缺失(如配置文件、数据库连接)。
    • 代码逻辑中出现不可恢复的异常(如断言失败)。

2. 基本用法

package main
import \"fmt\"
func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println(\"Recovered from panic:\", r)
        }
    }()
    fmt.Println(\"Start\")
    panic(\"something bad happened\") // 触发 panic
    fmt.Println(\"End\") // 不会执行
}

输出

Start
Recovered from panic: something bad happened

3. recover 的使用规则

  • 必须与 defer 结合:recover 只能在 defer 函数中生效。
  • 仅在当前 goroutine 有效:无法捕获其他 goroutine 的 panic。
func mayPanic() {
    panic(\"a problem occurred\")
}
func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println(\"Recovered. Error:\", r)
        }
    }()
    mayPanic() // 触发 panic
    fmt.Println(\"After mayPanic()\") // 不会执行
}

4. 错误处理建议

  • 优先返回 error:常规错误应通过多返回值(如 error 类型)处理。
  • 谨慎使用 panic:仅在严重错误或不可恢复场景下使用(如程序启动失败)。
  • 在关键位置 recover:例如在 goroutine 的入口或 HTTP 请求处理器中,防止程序崩溃。

Web 服务器示例

func handleRequest() {
    defer func() {
        if err := recover(); err != nil {
            log.Println(\"Request failed:\", err)
        }
    }()
    // 处理请求逻辑(可能触发 panic)
}

5. 常见错误场景

  • 未捕获的 panic:若未在 defer 中调用 recover,程序会崩溃。
  • 跨 goroutine panic:每个 goroutine 需独立处理自己的 panic。

总结

  • panic:用于终止程序执行并传递错误信息。
  • recover:在 defer 中捕获 panic,恢复程序流程。
  • 最佳实践:优先使用错误返回值,仅在必要时结合 panicrecover

通过合理使用这两个关键字,可以提升程序的健壮性,避免因未处理异常导致的崩溃。

到此这篇关于golang panic 函数用法的文章就介绍到这了,更多相关golang panic 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang熔断器的开发过程详解

    Golang熔断器的开发过程详解

    Golang熔断器是一种用于处理分布式系统中服务调用的故障保护机制,它可以防止故障服务的连锁反应,提高系统的稳定性和可靠性,本文将给大家详细的介绍一下Golang熔断器的开发过程,需要的朋友可以参考下
    2023-09-09
  • Golang中crypto/cipher加密标准库全面指南

    Golang中crypto/cipher加密标准库全面指南

    本文主要介绍了Golang中crypto/cipher加密标准库,包括对称加密、非对称加密以及使用流加密和块加密算法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • golang获取用户输入的几种方式

    golang获取用户输入的几种方式

    这篇文章给大家介绍了golang获取用户输入的几种方式,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友跟着小编一起来学习吧
    2024-01-01
  • 优雅使用GoFrame共享变量Context示例详解

    优雅使用GoFrame共享变量Context示例详解

    这篇文章主要为大家介绍了优雅使用GoFrame共享变量Context示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • go中string、int、float相互转换的实现示例

    go中string、int、float相互转换的实现示例

    本文主要介绍了go中string、int、float相互转换的实现示例,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 正则表达式详解以及Golang中的应用示例

    正则表达式详解以及Golang中的应用示例

    这篇文章主要介绍了正则表达式详解以及Golang中应用的相关资料,Go语言的regexp包是Go语言标准库中的一个重要组件,用于处理正则表达式,文中通过代码将用法介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • go语言字符串的拼接和切片方法总结

    go语言字符串的拼接和切片方法总结

    在go语言中,因为字符串只能被访问,不能被修改,所以进行字符串拼接的时候,golang都需要进行内存拷贝,造成一定的性能消耗,这篇文章主要给大家介绍了关于go语言字符串的拼接和切片的相关资料,需要的朋友可以参考下
    2022-11-11
  • golang 使用 viper 读取自定义配置文件

    golang 使用 viper 读取自定义配置文件

    这篇文章主要介绍了golang 使用 viper 读取自定义配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Go语言实战之实现均衡器功能

    Go语言实战之实现均衡器功能

    这篇文章主要为大家详细介绍了如何利用Golang 实现一个简单的流浪均衡器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • 从零开始学Golang的接口

    从零开始学Golang的接口

    本文主要介绍了从零开始学Golang的接口,原文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论