Rumah >pembangunan bahagian belakang >Golang >Mengapakah Loop1 Mencetak 'kemas kini' Tiga Kali Semasa Loop2 Mencetak Nilai Berbeza dalam Contoh Kod Go Ini?
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!