Adakah pembolehubah untuk gelung dalam Go tidak ditangkap sebagai pembolehubah penutupan yang diperuntukkan secara setempat?
Tidak, pembolehubah untuk gelung yang ditangkap dalam Go secara lalai ditangkap sebagai nilai, bukan pembolehubah. Tingkah laku ini berbeza daripada bahasa seperti C#, yang memerlukan sintaks tambahan untuk menangkap pembolehubah dan bukannya nilai.
Contoh: Menangkap Pembolehubah Gelung sebagai Nilai
package main import "fmt" func main() { a := 1 b := func() { fmt.Println(a) } // b captures the value of a, not the variable itself a++ b() // prints 1, not 2 }
Dalam contoh ini , fungsi b menangkap nilai a pada masa ia ditakrifkan, dan bukannya mengekalkan rujukan kepada pembolehubah itu sendiri. Akibatnya, sebarang perubahan yang dibuat kepada a selepas mentakrifkan b tidak akan ditunjukkan dalam nilai yang dicetak oleh b.
Contoh: Menangkap Pembolehubah Gelung sebagai Pembolehubah
Walau bagaimanapun, ia adalah mungkin untuk menangkap pembolehubah gelung sebagai pembolehubah dengan menggunakan sintaks penutupan yang mencipta skop baharu untuk setiap satu lelaran:
package main import "fmt" func main() { a := 1 for a < 10 { b := func() { fmt.Println(a) } // b captures the variable a in a new scope a++ b() // prints 2, 3, 4, ..., 10 } }
Dalam contoh ini, kata kunci func digunakan untuk membuat penutupan bagi setiap lelaran gelung. Teknik ini memastikan bahawa setiap penutupan menangkap rujukan unik kepada pembolehubah gelung, membolehkan kami memerhati nilai a apabila ia berubah dalam gelung.
Kesimpulan
Pergi menangkap pembolehubah untuk gelung sebagai nilai secara lalai, tetapi ia juga menyediakan sintaks penutupan yang membenarkan pembolehubah gelung untuk ditangkap sebagai pembolehubah. Memahami perbezaan ini adalah penting untuk mengelakkan kekeliruan dan menulis kod Go yang betul dan cekap.
Atas ialah kandungan terperinci Adakah Go Capture For-Gelung Pembolehubah sebagai Nilai atau Pembolehubah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!