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 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go中log包异或组合配置妙用详解

    Go中log包异或组合配置妙用详解

    在 Go 语言的 log 包中,使用“位运算相或” (|) 来配置日志的 flag,可以让我们灵活地组合多种日志信息输出选项,下面我们就来看看这种方法的好处和原理吧
    2024-11-11
  • Go Java算法之单词搜索示例详解

    Go Java算法之单词搜索示例详解

    这篇文章主要为大家介绍了Go Java算法之单词搜索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言struct类型详解

    Go语言struct类型详解

    这篇文章主要介绍了Go语言struct类型详解,struct是一种数据类型,可以用来定义自己想的数据类型,需要的朋友可以参考下
    2014-10-10
  • golang beego框架路由ORM增删改查完整案例

    golang beego框架路由ORM增删改查完整案例

    这篇文章主要为大家介绍了golang beego框架路由ORM增删改查完整案例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Golang TCP网络编程的具体实现

    Golang TCP网络编程的具体实现

    go语言是一门功能强大的编程语言,它提供了众多的网络编程库,其中包括tcp/ip,本文主要介绍了Golang TCP网络编程的具体实现,具有一定的参考价值,感兴趣的可以来了解一下
    2024-06-06
  • Go语言实现多文本文件合并的示例代码

    Go语言实现多文本文件合并的示例代码

    这篇文章主要为大家详细介绍了使用Go语言实现多文本文件合并的相关知识,适用于初学者学习文件读取与写入的综合运用,有需要的小伙伴可以了解下
    2025-07-07
  • Golang urfave/cli库简单应用示例详解

    Golang urfave/cli库简单应用示例详解

    这篇文章主要为大家介绍了Golang urfave/cli库简单应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 在goland中配置gofmt的操作

    在goland中配置gofmt的操作

    这篇文章主要介绍了在goland中配置gofmt的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一起来用GoLand开发第一个Go程序

    一起来用GoLand开发第一个Go程序

    当您在编辑器中工作时GoLand 会分析您的代码,寻找优化方法,并检测潜在和实际问题,下面这篇文章主要给大家介绍了关于用GoLand开发第一个Go程序的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Gin框架中的PostForm用法及说明

    Gin框架中的PostForm用法及说明

    这篇文章主要介绍了Gin框架中的PostForm用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论