Rumah >pembangunan bahagian belakang >Golang >Mengapa Go Concurrency Loops dengan Fungsi Tanpa Nama Mencetak Nilai Yang Sama?
Memahami Gelagat Tidak Dijangka Go Concurrency dengan For Loops dan Fungsi Tanpa Nama
Dalam Go, apabila menggunakan gelung for untuk mencipta goroutine dengan tanpa nama fungsi, tingkah laku yang tidak dijangka boleh timbul, menyebabkan semua goroutine mencetak nilai yang sama. Untuk memahami tingkah laku ini, mari kita analisa kod berikut:
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() }
Anehnya, kod ini mencetak "6, 6, 6, 6, 6," dan bukannya "2, 4, 1, 5" yang dijangkakan. 3." Anomali ini dikaitkan dengan penutupan yang dibuat oleh fungsi tanpa nama.
Dalam Go, penutupan ialah fungsi yang menangkap pembolehubah daripada skop sekelilingnya. Dalam kod di atas, setiap fungsi tanpa nama menangkap pembolehubah i. Walau bagaimanapun, apabila gelung for berulang, i sudah berada pada 5. Ini bermakna semua penutupan menangkap nilai i yang sama, iaitu 6.
Untuk menyelesaikan isu ini, kita boleh memberikan i sebagai hujah kepada fungsi tanpa nama. Dengan berbuat demikian, kami mencipta salinan tempatan i yang ditangkap oleh setiap penutupan, memastikan setiap goroutine mencetak nilai yang betul:
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func(i int) { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }(i) } wg.Wait() }
Atas ialah kandungan terperinci Mengapa Go Concurrency Loops dengan Fungsi Tanpa Nama Mencetak Nilai Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!