在Go 中,「defer」語句允許函數延遲函數呼叫的執行,直到周圍函數返回。當 defer 語句捕捉閉包的參數時,此行為可能會導致意外結果。
第2 部分與第3 部分:捕獲的參數
考慮以下程式碼:
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 部分」中,defer 語句建立一個捕獲變數「i」的閉包。執行閉包時,「i」變數的值是在 range 語句的最後一次迭代中的值,即 4。因此,輸出為“44444”。
第 3 部分:
在「第 3 部分」中,defer 語句建立了一個不捕獲任何外部變數的閉包。當執行 defer 語句時,就會計算閉包的「n」參數,並在此時接收「i」的值。這會產生所需的輸出“43210”,因為每個延遲函數呼叫對“n”使用不同的值。
重點:
理解捕獲defer 語句的行為對於避免 Go 程式碼中出現意外結果至關重要。
以上是Go 的 defer 語句如何處理閉包參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!