Rumah >pembangunan bahagian belakang >Golang >Mengapa Contoh My Go Concurrency Mencetak \'6\' Lima Kali Daripada Nombor Unik?
Go Concurrency with for Loop and Anonymous Function Excitation
Dalam usaha untuk meningkatkan pemahaman concurrency menggunakan penyegerakan Go.WaitGroup, seorang pembangun menghadapi tingkah laku yang tidak dijangka dengan kod yang direka untuk memudahkan muat naik berbilang ke Amazon S3. Coretan kod awal dibentangkan:
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
Mengejutkan pembangun, output secara konsisten memaparkan "6, 6, 6, 6, 6," menyimpang daripada susunan yang dijangkakan seperti "2, 4, 1 , 5, 3." Apabila gelung berulang sehingga 5, hasil 6 yang tidak dijangka muncul. Pengubahsuaian seterusnya yang menggabungkan i sebagai hujah dalam fungsi tanpa nama menghasilkan output yang dimaksudkan.
Menyingkap Rasional
Dokumentasi untuk penutupan dalam Go menjelaskan tingkah laku ini. Apabila gelung for berlangsung, penutupan menangkap nilai i pada masa definisinya. Oleh itu, walaupun gelung ditamatkan selepas i mencapai 5, goroutine melaksanakan dengan nilai kongsi 6, akhirnya mencetak "6, 6, 6, 6, 6."
Dengan memberikan i sebagai hujah, a pembolehubah baharu menangkap nilai i pada saat pengisytiharannya, menghasilkan output yang diingini.
Atas ialah kandungan terperinci Mengapa Contoh My Go Concurrency Mencetak \'6\' Lima Kali Daripada Nombor Unik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!