首頁 > 後端開發 > Golang > Go 延遲呼叫:參數是立即求值還是在函數執行時求值?

Go 延遲呼叫:參數是立即求值還是在函數執行時求值?

Mary-Kate Olsen
發布: 2024-12-06 00:44:11
原創
574 人瀏覽過

Go Deferred Calls: Are Arguments Evaluated Immediately or Upon Function Execution?

延遲呼叫的參數:立即計算與函數執行

在 Go 中,延遲函數呼叫允許您在周圍函數返回後執行程式碼。但是,如果您不了解如何處理參數,則延遲呼叫的行為可能會令人困惑。

評估與執行

「Go 之旅」中的引述指出「延遲呼叫的參數會立即求值,但直到周圍函數返回後才會執行函數呼叫。」這表示:

  • 求值: 當您延遲函數呼叫時,將求值並擷取函數值及其參數。當呼叫封閉函數時會發生這種情況。
  • 執行:封閉函數傳回後,執行延遲函數。

範例說明

讓我們檢查一下提供的範例:

func def(s string) func() {
    fmt.Println("tier up")
    fmt.Println(s)
    return func() { fmt.Println("clean up") }
}

func main() {
    defer def("defered line")()
    fmt.Println("main")
}
登入後複製

何時main() 被調用,會發生以下情況:

  1. defer 語句將參數計算為def,它是常數字串「defered line」。
  2. def 函數被呼叫“defered line”,印出“tier up”和“defered line”。
  3. def 的回傳值是一個印出「clean up」的函數。該函數尚未執行。
  4. main() 印出「main」。
  5. main() 返回後,將執行延遲函數,列印「clean up」。

結論

理解參數求值和函數執行之間的區別對於在 Go 中有效使用延遲呼叫至關重要。執行 defer 語句時會立即計算參數,而函數體僅在封閉函數傳回時執行。這使您可以控制執行操作的順序,並避免與意外函數行為相關的潛在問題。

以上是Go 延遲呼叫:參數是立即求值還是在函數執行時求值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板