首頁  >  文章  >  後端開發  >  緊急恢復可以修改 Go 中函數文字中的局部變數嗎?

緊急恢復可以修改 Go 中函數文字中的局部變數嗎?

Susan Sarandon
Susan Sarandon原創
2024-10-31 09:18:02289瀏覽

Can Panic Recovery Modify Local Variables in Function Literals in 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
}

func bar() {
    panic("panic happened")
}</code>

此程式碼按預期工作,將 result 設為 -1 並將 err 設定為 a從恐慌中恢復後的自訂錯誤訊息。但是,如果我們在函數文字中使用局部變量,行為會發生變化:

<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
}

func bar() {
    panic("panic happened")
}</code>

在這種情況下,結果將重設為 0 而不是 -1。這是因為函數文字中的 defer 語句無法存取或修改指定的回傳值,因為它們不再在範圍內。

根據Go 文檔,「...如果延遲函數是函數文字並且周圍函數具有在文字範圍內的命名結果參數,延遲函數可以在返回結果參數之前存取和修改結果參數。」

因此,在嘗試時使用命名返回值至關重要使用函數文字中的defer 語句修改它們。這種情況下的局部變數無法存取或修改。

以上是緊急恢復可以修改 Go 中函數文字中的局部變數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn