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
Patricia Arquetteasal
2024-12-19 18:20:10988semak imbas

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)
        }
    }
}
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:

  • 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!

Kenyataan:
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