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
Lepaskan: 2024-12-06 03:07:11
asal
479 orang telah melayarinya

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()
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan