Rumah > Artikel > pembangunan bahagian belakang > Mengapa Menangguhkan Penangkapan Penutupan dalam Go Membawa kepada Gelagat Tidak Dijangka?
Menangguhkan Penangkapan Penutupan dalam Go
Pernyataan penangguhan Go boleh digunakan untuk melaksanakan fungsi selepas fungsi sekeliling kembali. Walau bagaimanapun, apabila digunakan dengan penutupan, adalah penting untuk memahami cara penangkapan parameter berfungsi.
Isunya
Pertimbangkan kod berikut:
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 }
Keluaran kod ialah:
0 1 2 3 4 4 3 2 1 0 4 4 4 4 4
Analisis
Perbezaan Utama
Perbezaan penting antara bahagian 2 dan 3 terletak pada sama ada penutupan menangkap pembolehubah luar atau tidak. Dalam bahagian 2, penutupan menangkap i, yang merupakan rujukan kepada pembolehubah luar. Dalam bahagian 3, penutupan tidak mempunyai sebarang rujukan luar, jadi setiap panggilan mempunyai nilai n yang berbeza.
Pertimbangan Tambahan
Atas ialah kandungan terperinci Mengapa Menangguhkan Penangkapan Penutupan dalam Go Membawa kepada Gelagat Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!