Go 中延遲閉包擷取
Go 的 defer 語句可用於在周圍函數傳回後執行函數。然而,當與閉包一起使用時,了解參數捕獲的工作原理非常重要。
問題
考慮以下程式碼:
package main 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 }
程式碼的輸出是:
0 1 2 3 4 4 3 2 1 0 4 4 4 4 4
分析
主要區別
第 2 部分和第 3 部分之間的關鍵區別在於閉包是否捕獲外部變數。在第 2 部分中,閉包捕獲 i,它是對外部變數的引用。在第 3 部分中,閉包沒有任何外部引用,因此每個呼叫都有不同的 n 值。其他注意事項
以上是為什麼在 Go 中延遲關閉擷取會導致意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!