go语言的panic和defer

在Go语言中,panic 和 defer 是两个非常有用的特性,它们与错误处理紧密相关,但各自扮演着不同的角色。

Panic

panic 是一个内建函数,用于中断当前函数的执行,并开始逐层向上执行函数中的延迟(deferred)函数。如果所有的延迟函数都执行完毕,但 panic 的调用者仍然没有处理这个 panic(例如,通过 recover),则程序会终止并打印出传递给 panic 的参数的值。这通常用于表示无法恢复的严重错误情况。

使用场景

当遇到严重错误,且程序无法继续执行时。

当需要立即终止当前操作,并通知调用者注意时。

示例

func causePanic() {

    panic("something bad happened!")

}

 

func main() {

    defer fmt.Println("deferred in main")

    causePanic()

    fmt.Println("this line will not be executed")

}

// 输出:

// deferred in main

// panic: something bad happened!

 

Defer

defer 语句会延迟函数的执行直到包含它的函数即将返回。defer 语句经常用于简化资源清理操作,如关闭文件、解锁互斥锁或记录时间等。无论函数是通过正常返回还是由于 panic 而终止,defer 语句都会被执行。

使用场景

需要在函数退出时执行清理操作。

需要在函数结束时执行特定的代码,无论函数是正常返回还是由于 panic 而终止。

示例

func readFile(filename string) ([]byte, error) {

    file, err := os.Open(filename)

    if err != nil {

        return nil, err

    }

    defer file.Close() // 确保在函数退出时关闭文件

 

    // 读取文件内容...

 

    return data, nil

}

 

func main() {

    data, err := readFile("example.txt")

    if err != nil {

        fmt.Println("Error:", err)

        return

    }

    fmt.Println("File content:", string(data))

}

 

Panic 和 Defer 的结合使用

 

defer 和 panic 经常一起使用来在发生错误时执行清理操作,并通过 recover 来捕获和处理 panic,以避免程序完全终止。

示例

func mightPanic() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("Recovered from", r)

        }

    }()

    // 可能会引发panic的代码

    panic("oops!")

}

 

func main() {

    mightPanic()

    fmt.Println("This line will be executed")

}

// 输出:

// Recovered from oops!

// This line will be executed

在这个例子中,mightPanic 函数中的 panic 被 defer 语句中的匿名函数捕获并处理,因此程序能够继续执行 main 函数中的后续代码。

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值