了解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中文網其他相關文章!