在 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 部分中,閉包不捕獲任何參數。這表示當執行閉包時,變數 i 具有執行 defer 語句時的值。在這種情況下,i 將具有 for 迴圈最後一次迭代的值,即 4。因此,第2 部分的輸出將是:
4 4 4 4 4
在第3 部分中,閉包捕獲參數n,該參數正在創建閉包時被初始化為i 的值。這表示當執行閉包時,n 將具有執行 defer 語句時的值。在這種情況下,每個閉包會捕捉不同的i 值,從而產生輸出:
4 3 2 1 0
第2 部分和第3 部分之間的主要區別在於第2 部分捕獲i可變,而第3 部分則不然。這會影響閉包執行時的行為,導致不同的輸出。
以上是Go閉包中如何延遲擷取參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!