欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Go語言中defer和panic的執(zhí)行順序

 更新時間:2025年05月26日 09:32:25   作者:紙鳶666  
defer?和?panic?的執(zhí)行順序是一個重要的概念,本文主要介紹了Go語言中defer和panic的執(zhí)行順序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡介

在 Go 語言中,defer 和 panic 的執(zhí)行順序是一個重要的概念。本文將通過一個示例代碼來詳細解釋為什么 defer 中的代碼會先執(zhí)行,而 panic 的錯誤信息稍后才輸出。

示例代碼

package main

import "fmt"

func mayPanic() {
    panic("a problem")
}

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()

    mayPanic()

    fmt.Println("After mayPanic()")
}

執(zhí)行順序解釋

1. defer 的執(zhí)行機制

defer 的作用是延遲執(zhí)行一個函數(shù)調用,直到包含它的函數(shù)執(zhí)行完畢。無論函數(shù)是正常結束還是因為錯誤(如 panic)結束,所有被 defer 延遲的函數(shù)都會按照后進先出(LIFO)的順序執(zhí)行。

2. panic 的傳播機制

當 panic 被觸發(fā)時,Go 會立即中斷當前函數(shù)的正常執(zhí)行流程,并開始向上層調用棧傳播錯誤信號。在這個過程中,Go 會依次執(zhí)行當前函數(shù)中所有被 defer 延遲的函數(shù)。這些延遲函數(shù)可以通過 recover() 捕獲并處理 panic。

3. 代碼執(zhí)行順序

(1) 執(zhí)行 main() 函數(shù)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()

    mayPanic()  // 觸發(fā) panic
    fmt.Println("After mayPanic()")  // 這行代碼不會執(zhí)行
}

(2) 調用 mayPanic()

func mayPanic() {
    panic("a problem")
}

panic("a problem") 被觸發(fā),程序會立即中斷當前函數(shù)的執(zhí)行,并將 panic 信息傳播到上層調用棧。

(3) 觸發(fā) defer 延遲函數(shù)

由于 panic 的觸發(fā),Go 會開始執(zhí)行 main() 函數(shù)中被 defer 延遲的函數(shù):

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered. Error:\n", r)
    }
}()

在這個延遲函數(shù)中,recover() 被調用,捕獲了 panic 的錯誤信息 "a problem",并打印出來。

(4) panic 被恢復

由于 recover() 成功捕獲了 panic,程序的正常執(zhí)行流程得以恢復。不過,panic 的傳播已經中斷了 main() 函數(shù)的正常執(zhí)行,因此 fmt.Println("After mayPanic()") 不會執(zhí)行。

4. 輸出結果順序

按照以上執(zhí)行順序,程序的輸出如下:

Recovered. Error:
 a problem

為什么 defer 先執(zhí)行?

這是因為 panic 的傳播機制會觸發(fā)所有 defer 延遲函數(shù)的執(zhí)行。defer 的設計初衷是確保某些重要的清理操作(如釋放資源、關閉文件等)能夠在函數(shù)結束時執(zhí)行,即使函數(shù)是因 panic 而異常結束的。

總結來說:

  • panic 會中斷當前函數(shù)的執(zhí)行。

  • Go 會依次執(zhí)行所有被 defer 延遲的函數(shù)。

  • recover() 可以在延遲函數(shù)中捕獲 panic 并恢復程序的執(zhí)行。

總結

通過上述代碼和解釋,我們可以清楚地看到 defer 和 panic 的執(zhí)行順序是由 Go 語言的設計規(guī)則決定的。defer 確保了清理操作的執(zhí)行,而 panic 的傳播機制允許我們在延遲函數(shù)中捕獲并處理錯誤。

到此這篇關于Go語言中defer和panic的執(zhí)行順序的文章就介紹到這了,更多相關Go語言 defer和panic執(zhí)行順序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go map定義的方式及修改技巧

    Go map定義的方式及修改技巧

    這篇文章主要給大家介紹了關于Go map定義的方式及修改技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Go?gRPC教程實現(xiàn)Simple?RPC

    Go?gRPC教程實現(xiàn)Simple?RPC

    這篇文章主要為大家介紹了Go?gRPC教程實現(xiàn)Simple?RPC示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go語言獲取文件的名稱、前綴、后綴

    Go語言獲取文件的名稱、前綴、后綴

    這篇文章主要介紹了Go語言獲取文件的名稱、前綴、后綴,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 淺析Go匯編語法和MatrixOne使用介紹

    淺析Go匯編語法和MatrixOne使用介紹

    MatrixOne由Go語言所開發(fā)是一個新一代超融合異構數(shù)據(jù)庫,致力于打造單一架構處理TP、AP、流計算等多種負載的極簡大數(shù)據(jù)引擎,今天通過本文給大家介紹Go匯編語法和MatrixOne使用,感興趣的朋友一起看看吧
    2022-04-04
  • Golang實現(xiàn)smtp郵件發(fā)送的示例代碼

    Golang實現(xiàn)smtp郵件發(fā)送的示例代碼

    這篇文章主要為大家詳細介紹了Golang實現(xiàn)smtp郵件發(fā)送的相關知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Golang中for循環(huán)的用法示例詳解

    Golang中for循環(huán)的用法示例詳解

    for循環(huán)就是讓一段代碼循環(huán)的執(zhí)行,接下來通過本文給大家講解Golang中for循環(huán)的用法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • golang連接kafka的示例代碼

    golang連接kafka的示例代碼

    本文主要介紹了golang連接kafka的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • golang int 轉float 強轉和高精度轉操作

    golang int 轉float 強轉和高精度轉操作

    這篇文章主要介紹了golang int 轉float 強轉和高精度轉操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go?tar包歸檔文件處理操作全面指南

    go?tar包歸檔文件處理操作全面指南

    這篇文章主要為大家介紹了使用go?tar包歸檔文件處理操作全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang程序中使用Prometheus的client_golang庫

    Golang程序中使用Prometheus的client_golang庫

    這篇文章主要介紹了Golang程序中使用Prometheus的client_golang庫,Prometheus 是一個開源的監(jiān)控和警報工具包,用于收集和處理應用程序和系統(tǒng)的指標數(shù)據(jù)。Prometheus 提供了多種客戶端庫,可以輕松地集成到各種編程語言中
    2023-04-04

最新評論