首頁 > 後端開發 > Golang > 主體

局部變數在 Go 的緊急恢復中如何表現?

Mary-Kate Olsen
發布: 2024-10-29 14:20:02
原創
648 人瀏覽過

How Do Local Variables Behave in Panic Recovery in Go?

了解Go 的緊急復原中的局部變數賦值

Go 中的緊急復原允許您優雅地處理運行時錯誤,但會在執行時間上優雅出現一個常見的誤解在恢復函數中使用局部變數時。

命名回傳值緊急復原

處理命名回傳值時,復原函數可以在這些變數被呼叫之前存取它們。回來了。這使您可以在defer 函數中為它們賦值:

<code class="go">func foo() (result int, err error) {
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()
    result = 100
    err = nil
    return
}</code>
登入後複製

緊急復原中的局部變數賦值

但是,當使用具有未命名返回值的局部變數時,這種行為有所不同。局部變數在堆疊上創建,並在進入函數時用零值進行初始化。如果在分配之前發生恐慌,它們將保留零值。

<code class="go">func foo() (int, error) {
    var result int
    var err error
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()
    result = 100
    err = nil
    return result, err
}</code>
登入後複製

在此範例中,result 和 err 分別初始化為 0 和 nil。當在進行任何分配之前發生恐慌時,將傳回這些零值。因此,輸出將是:

result: 0
登入後複製

關鍵區別

命名返回值被視為命名變量,允許 defer 函數直接修改它們。另一方面,局部變數儲存在堆疊上,並且在分配之前不能被 defer 函數存取。

結論

當從恐慌中恢復時局部變量,理解局部變量在被賦值之前不會被初始化是至關重要的。因此,如果在賦值之前發生恐慌,它們將保留零值並影響回傳值。

以上是局部變數在 Go 的緊急恢復中如何表現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!