為什麼無法使用局部變數修改 Go 中的回傳值進行緊急復原?
使用命名回傳時,提供的緊急復原程式碼可以成功運行值,但在使用局部變數時無法如預期運作。要理解這種行為,理解 defer 語句背後的基本概念至關重要。
如 Go 教程基礎知識中所解釋的,命名返回值充當在函數開始時定義的變數。但是,當 defer 語句使用函數文字,並且包含函數在文字範圍內具有命名結果參數時,defer 函數可以在這些參數返回之前存取和修改這些參數。
但是,請務必注意當 main 函數完成時,defer 函數的任何回傳值都會被丟棄。這意味著,在局部變數的程式碼的情況下,對恐慌恢復閉包內的 result 和 err 變數所做的修改不會反映在 foo 函數傳回的最終回傳值中。
相反,具有命名返回值,由於變數是在defer 函數外部有效定義的,並且在函數內具有全域作用域,因此當函數完成時,在defer 閉包中對它們所做的修改將被保留。
因此,當恐慌恢復時可用於修改命名返回值,但由於 defer 語句與函數文字和參數範圍交互的方式,它不能用於與局部變數實現相同的行為。
以上是為什麼緊急復原會修改 Go 中的命名回傳值而不是局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!