MST

星途 面试题库

面试题:Go中panic和recover的基础应用场景

请描述在Go语言中,panic通常在哪些情况下会被使用,以及与之配合的recover一般在什么结构中使用来捕获panic并进行处理?举例说明一个简单场景。
19.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

panic的使用场景

  1. 不可恢复的错误:当程序遇到无法继续正常执行的严重错误时,例如数组越界、空指针引用等Go语言运行时会自动触发panic。另外,在一些业务逻辑中,如果遇到不符合预期且无法继续执行的情况,也可以手动调用panic。比如在解析配置文件时,若配置格式严重错误,程序无法继续运行,就可以使用panic
  2. 快速失败机制:在程序初始化阶段,如果某些关键资源无法获取,如数据库连接失败、无法读取必要的系统配置等,为避免程序在不健康的状态下运行,可以使用panic让程序快速失败。

recover的使用结构

recover一般在defer函数中使用。defer语句会将其后面跟随的函数推迟到包含该defer语句的函数结束时执行。当panic发生时,程序会立即停止当前函数的执行,开始执行defer语句,此时recoverdefer函数中可以捕获到panic,并进行相应处理。

简单场景示例

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    testPanic()
    fmt.Println("This line will be printed after recovery")
}

func testPanic() {
    panic("This is a test panic")
}

在上述代码中,testPanic函数手动触发了一个panic。在main函数中,通过defer语句定义了一个匿名函数,在这个匿名函数中使用recover捕获panic。当testPanic触发panic后,程序控制权转到defer函数,recover捕获到panic信息并打印,main函数后续的fmt.Println("This line will be printed after recovery")语句得以继续执行。