最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言中的recover()函數(shù)用法解讀

 更新時間:2025年07月08日 09:58:25   作者:言之。  
Go語言recover()用于捕獲panic,需與defer配合使用,在defer中調(diào)用時返回panic值,否則返回nil,Go1.21后panic(nil)觸發(fā)runtime panic,recover返回*runtime.PanicNilError,應僅用于處理意外情況,注意作用域限制及性能影響

recover() 是 Go 語言中用于處理 panic 的內(nèi)置函數(shù),它允許程序管理發(fā)生 panic 的 goroutine 的行為。

下面我將詳細解釋它的工作原理和使用方法。

基本概念

1. 函數(shù)簽名

func recover() any

2. 核心功能

recover() 可以:

  • 停止 panic 的傳播
  • 返回傳遞給 panic() 的值
  • 恢復正常的程序執(zhí)行

工作原理

1. 使用位置

recover() 必須在 defer 函數(shù)中直接調(diào)用才有效:

defer func() {
    if r := recover(); r != nil {
        // 處理 panic
    }
}()

2. 返回值

  • 當 goroutine 正在 panic 且在 defer 函數(shù)中調(diào)用時:返回傳遞給 panic() 的值
  • 其他情況(包括 panic 參數(shù)為 nil 的情況,Go 1.21 之前):返回 nil

使用示例

基本用法

func mayPanic() {
    panic("something went wrong")
}

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
  
    mayPanic()
    fmt.Println("This will not be executed if panic occurs")
}

輸出:Recovered from panic: something went wrong

實際應用場景

func safeDivide(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("runtime error: %v", r)
        }
    }()
  
    return a / b, nil
}

重要特性

必須與 defer 配合使用:只有在 defer 函數(shù)中直接調(diào)用才有效

作用域限制:只能恢復同一個 goroutine 中的 panic

Go 1.21 的變化

  • 之前版本:panic(nil)recover() 返回 nil
  • Go 1.21+:panic(nil) 會引發(fā) runtime panic,recover() 返回 *runtime.PanicNilError

注意事項

  1. 不要濫用 recover:應該只用于處理真正的意外情況,而不是替代常規(guī)錯誤處理
  2. 資源清理:即使 panic 被 recover,defer 函數(shù)仍然會執(zhí)行
  3. 跨 goroutine:無法恢復其他 goroutine 的 panic
  4. 性能影響:panic/recover 比常規(guī)錯誤處理機制性能差

與 panic 的關(guān)系

recover()panic() 是配套使用的:

func doSomething() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()
  
    if somethingWrong {
        panic("critical error")
    }
}

最佳實踐

  1. 為關(guān)鍵代碼段添加 recover
  2. 記錄 recover 到的錯誤信息
  3. 盡量讓程序在 recover 后能繼續(xù)正常運行
  4. 避免在庫函數(shù)中靜默地 recover 而不返回錯誤

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go語言Echo服務器的方法

    Go語言Echo服務器的方法

    這篇文章主要介紹了Go語言Echo服務器的方法,實例分析了Echo服務器的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù)

    go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù)

    這篇文章主要為大家介紹了go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Golang實現(xiàn)的聊天程序服務端和客戶端代碼分享

    Golang實現(xiàn)的聊天程序服務端和客戶端代碼分享

    這篇文章主要介紹了Golang實現(xiàn)的聊天程序服務端和客戶端代碼分享,本文先是講解了實現(xiàn)邏輯,然后給出了實現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • Go語言中的GitOps實戰(zhàn)

    Go語言中的GitOps實戰(zhàn)

    本文主要介紹了Go語言中的GitOps實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • Go Mongox輕松實現(xiàn)MongoDB的時間字段自動填充

    Go Mongox輕松實現(xiàn)MongoDB的時間字段自動填充

    這篇文章主要為大家詳細介紹了Go語言如何使用 mongox 庫,在插入和更新數(shù)據(jù)時自動填充時間字段,從而提升開發(fā)效率并減少重復代碼,需要的可以參考下
    2025-02-02
  • 分析Go語言接口的設(shè)計原則

    分析Go語言接口的設(shè)計原則

    interface是Go語言的基礎(chǔ)特性之一, 可以理解為對一種類型的規(guī)范或者約束。他跟java、c++不同, Go語言實現(xiàn)接口不需要顯示說明實現(xiàn)了哪個接口, 也沒有繼承或者子類或者implement關(guān)鍵字。只是通過約定的形式, 隱式的實現(xiàn)接口中的方法即可
    2021-06-06
  • Go互斥鎖和讀寫鎖完整代碼舉例

    Go互斥鎖和讀寫鎖完整代碼舉例

    讀寫鎖(sync.RWMutex)與互斥鎖(sync.Mutex)是Go語言中兩種最核心的并發(fā)控制機制,本質(zhì)區(qū)別在于對讀操作的并發(fā)支持,這篇文章主要介紹了Go互斥鎖和讀寫鎖的相關(guān)資料,需要的朋友可以參考下
    2026-06-06
  • Go在GoLand中引用github.com中的第三方包具體步驟

    Go在GoLand中引用github.com中的第三方包具體步驟

    這篇文章主要給大家介紹了關(guān)于Go在GoLand中引用github.com中第三方包的具體步驟,文中通過圖文介紹的非常詳細,對大家學習或者使用Go具有一定的參考價值,需要的朋友可以參考下
    2024-01-01
  • VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題)

    VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題)

    這篇文章主要介紹了VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Golang 中的直接依賴和間接依賴管理詳解

    Golang 中的直接依賴和間接依賴管理詳解

    在 Golang 中,依賴管理是非常重要的,直接依賴是指項目代碼中明確引用的其他包的依賴,而間接依賴是指直接依賴所引用的其他包的依賴,這篇文章主要介紹了Golang 中的直接依賴和間接依賴管理,需要的朋友可以參考下
    2023-11-11

最新評論

台南县| 邳州市| 东平县| 岱山县| 晋州市| 孟津县| 报价| 顺义区| 玉林市| 长岭县| 理塘县| 巴中市| 叙永县| 繁昌县| 榆林市| 酉阳| 毕节市| 兴安县| 塔河县| 将乐县| 建水县| 静安区| 新乡县| 孟村| 鹤壁市| 紫云| 新田县| 韩城市| 耒阳市| 宜阳县| 慈利县| 宾阳县| 广西| 桃江县| 玉林市| 三穗县| 聂拉木县| 西宁市| 吉林省| 滕州市| 珲春市|