Rumah > pembangunan bahagian belakang > Golang > Mengapakah Gelung `julat` Go Menghasilkan Keputusan Berbeza dengan Struktur Gelung yang Berbeza?

Mengapakah Gelung `julat` Go Menghasilkan Keputusan Berbeza dengan Struktur Gelung yang Berbeza?

Patricia Arquette
Lepaskan: 2024-12-19 18:20:10
asal
988 orang telah melayarinya

Why Does Go's `range` Loop Produce Different Results with Varying Loop Structures?

Memahami Variasi Gelung Berbeza dalam Go

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.

Masalahnya

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)
        }
    }
}
Salin selepas log masuk
loop2() {
    for i, cmd := range cmds {
        // Capture the loop variable cmd using a new variable
        command := cmds[i]
        actions[cmd] = func() {
            fmt.Println(command)
        }
    }
}
Salin selepas log masuk

Menjalankan hasil gelung ini dalam output yang berbeza:

  • gelung1(): Mencetak "kemas kini" tiga kali
  • gelung2(): Mencetak "padam", "kemas kini" dan "buat"

Penjelasan

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.

Kesimpulan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan