Rumah >pembangunan bahagian belakang >Golang >Mengapa Contoh My Go Concurrency Mencetak \'6\' Lima Kali Daripada Nombor Unik?

Mengapa Contoh My Go Concurrency Mencetak \'6\' Lima Kali Daripada Nombor Unik?

Patricia Arquette
Patricia Arquetteasal
2024-12-06 03:07:11480semak imbas

Why Does My Go Concurrency Example Print

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!

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