Apabila melelaran pada kepingan dalam Go, anda mungkin menghadapi gelagat yang tidak dijangka apabila menggunakan kaedah julat. Mari kita teliti mengapa variasi gelung yang berbeza boleh menghasilkan hasil yang berbeza.
Pertimbangkan dua berikut untuk variasi gelung:
loop1() { for _, cmd := range cmds { // Store a function literal that references the loop variable cmd actions[cmd] = func() { fmt.Println(cmd) } } }
loop2() { for i, cmd := range cmds { // Capture the loop variable cmd using a new variable command := cmds[i] actions[cmd] = func() { fmt.Println(command) } } }
Menjalankan hasil gelung ini dalam output yang berbeza:
Isu dengan gelung1() timbul kerana literal fungsi yang disimpan dalam peta tindakan merujuk pembolehubah gelung cmd. Memandangkan terdapat hanya satu contoh pembolehubah gelung ini, semua fungsi yang disimpan dalam peta akan merujuk kepadanya.
Apabila gelung selesai, nilai cmd akan menjadi elemen terakhir dalam kepingan cmds, "update. " Akibatnya, apabila fungsi dalam peta tindakan dilaksanakan, semuanya akan mencetak "kemas kini."
Untuk memintas isu ini, loop2() menangkap pembolehubah gelung cmd menggunakan pembolehubah baharu, arahan. Ini mencipta salinan "tertanggal" pembolehubah gelung untuk setiap lelaran, yang tidak dipengaruhi oleh pembolehubah gelung selepas gelung selesai.
Akibatnya, setiap fungsi yang disimpan dalam peta tindakan dalam gelung2() mempunyai salinan pembolehubah gelungnya sendiri, yang membolehkan setiap fungsi mencetak arahan yang betul.
Apabila berada di atas sekeping, ia adalah penting untuk diketahui bahawa pembolehubah gelung dikongsi antara semua lelaran. Untuk mengelakkan tingkah laku yang tidak dijangka, amalan yang baik untuk menangkap atau melepaskan pembolehubah gelung menggunakan pembolehubah baharu, terutamanya apabila menggunakan literal fungsi yang akan dilaksanakan selepas gelung.
Atas ialah kandungan terperinci Mengapakah Gelung `julat` Go Menghasilkan Keputusan Berbeza dengan Struktur Gelung yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!