Rumah >pembangunan bahagian belakang >Golang >Mengapakah Loop1 Mencetak 'kemas kini' Tiga Kali Semasa Loop2 Mencetak Nilai Berbeza dalam Contoh Kod Go Ini?

Mengapakah Loop1 Mencetak 'kemas kini' Tiga Kali Semasa Loop2 Mencetak Nilai Berbeza dalam Contoh Kod Go Ini?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 03:53:14450semak imbas

Why Does Loop1 Print

Memahami Kelakuan Gelung dalam Go

Dalam pengaturcaraan, binaan tertentu boleh membawa kepada tingkah laku yang tidak dijangka. Pertimbangkan dua variasi untuk gelung ini:

var cmds = []string{"create", "delete", "update"}

func loop1() {
    actions := make(map[string]func())

    for _, cmd := range cmds {
        actions[cmd] = func() {
            fmt.Println(cmd)
        }
    }
    for _, action := range actions {
        action()
    }
}

func loop2() {
    actions := make(map[string]func())

    for i, cmd := range cmds {
        command := cmds[i]
        actions[cmd] = func() {
            fmt.Println(command)
        }
    }
    for _, action := range actions {
        action()
    }
}

Gelung1 mencetak "kemas kini" tiga kali, manakala gelung2 mencetak "padam", "kemas kini" dan "buat". Untuk memahami tingkah laku ini, mari kita mendalami butirannya.

Rujukan Pembolehubah Gelung

Dalam gelung1, kami mengisytiharkan cmd pembolehubah gelung dan menggunakannya untuk mengulang ke atas kepingan cmds . Walau bagaimanapun, dalam gelung bersarang, cmd pembolehubah masih merujuk pembolehubah gelung daripada gelung luar.

Perkongsian Nilai dalam Penutupan

Apabila mencipta literal fungsi dalam peta tindakan, pembolehubah gelung cmd ditangkap oleh penutupan. Ini bermakna setiap fungsi mewarisi rujukan kepada contoh pembolehubah gelung yang sama, bukan salinan.

Ketergantungan Nilai Terakhir

Apabila gelung bersarang selesai, pembolehubah gelung cmd telah berkembang ke elemen terakhir dalam kepingan ("kemas kini"). Ini bermakna semua penutupan kini merujuk kepada elemen terakhir.

Keputusan:

Apabila mencetak di dalam gelung bersarang, semua penutupan mencetak "kemas kini" kerana kesemuanya merujuk kepada elemen terakhir yang sama dalam slice.

Betulkan:

Untuk menyelesaikan isu ini, kami mencipta salinan pembolehubah gelung dalam gelung1 menggunakan cmd2 := cmd dan menggunakan salinan itu dalam literal fungsi . Ini memastikan setiap penutupan mempunyai rujukan yang berbeza kepada nilai cmd pada masa penciptaannya.

Penjelasan ini menyerlahkan nuansa pembolehubah gelung rujukan dalam penutupan dan menunjukkan kepentingan memahami dengan teliti cara penutupan menangkap pembolehubah dalam Go .

Atas ialah kandungan terperinci Mengapakah Loop1 Mencetak 'kemas kini' Tiga Kali Semasa Loop2 Mencetak Nilai Berbeza dalam Contoh Kod Go Ini?. 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