首頁 > 後端開發 > Golang > Go閉包中如何延遲擷取參數?

Go閉包中如何延遲擷取參數?

Mary-Kate Olsen
發布: 2024-11-10 17:53:02
原創
391 人瀏覽過

How Does Defer Capture Parameters in Go Closures?

在帶或不帶參數的 Go 中延遲捕獲

在 Go 中,defer 關鍵字可用於延遲函數的執行,直到周圍的函數返回。但是,當與匿名閉包一起使用時,行為可能會有所不同,具體取決於閉包捕獲其參數的方式。

考慮以下程式碼:

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

    for i := range whatever {
        defer func() { fmt.Println(i) }()
    } // part 2

    for i := range whatever {
        defer func(n int) { fmt.Println(n) }(i)
    } // part 3
}
登入後複製

第 2 部分:不含參數的閉包

在第 2 部分中,閉包不捕獲任何參數。這表示當執行閉包時,變數 i 具有執行 defer 語句時的值。在這種情況下,i 將具有 for 迴圈最後一次迭代的值,即 4。因此,第2 部分的輸出將是:

4 4 4 4 4
登入後複製

第3 部分:帶參數的閉包

在第3 部分中,閉包捕獲參數n,該參數正在創建閉包時被初始化為i 的值。這表示當執行閉包時,n 將具有執行 defer 語句時的值。在這種情況下,每個閉包會捕捉不同的i 值,從而產生輸出:

4 3 2 1 0
登入後複製

結論

第2 部分和第3 部分之間的主要區別在於第2 部分捕獲i可變,而第3 部分則不然。這會影響閉包執行時的行為,導致不同的輸出。

以上是Go閉包中如何延遲擷取參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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