Editor PHP Zimo membawakan anda soalan tentang Goroutine hari ini: Mengapakah hasil keluaran Goroutine kadangkala tidak betul? Goroutine ialah utas ringan dalam bahasa Go yang boleh melaksanakan tugas secara serentak, tetapi kadangkala hasil keluarannya mungkin tidak betul. Jadi, apakah punca keadaan ini? Mari kita terokai bersama-sama! Dengan memahami masalah ini, kita boleh lebih memahami cara Goroutine berfungsi dan mengelak daripada menghadapi masalah yang sama dalam pembangunan sebenar.
Saya sedang menonton kuliah di mana penulis membina aplikasi status menggunakan rutin go yang berkelakuan pelik selepas beberapa ketika.
Kod adalah seperti berikut:
65bcd28b0b95Output yang saya dapat ialah:
65bcd28b0ba0Saya tidak faham mengapa "amazon.com" terus berulang di sini? Mengapa ini berlaku selepas mencetak kesemua 5 pautan?
Masalahnya ialah dengan pembolehubah gelung l
的闭包捕获。由于 goroutine 是在循环内启动的,因此循环创建的所有 goroutine 共享 l
的相同内存地址。当睡眠结束并执行 goroutine 时,由于循环迭代剩余的链接,l
的值已更改。因此,所有 goroutine 最终都会检查 links
pautan terakhir dalam kepingan, iaitu "http://amazon.com".
Untuk menyelesaikan masalah ini, anda perlu menghantar pembolehubah gelung l
sebagai parameter kepada fungsi tanpa nama di dalam goroutine. Berikut ialah versi kod yang dikemas kini:
for l := range c { go func(link string) { time.Sleep(5 * time.Second) checkLink(link, c) }(l) }
Dengan menghantar l
作为参数传递给匿名函数,每个 goroutine 将拥有自己的 l
sebagai hujah kepada fungsi tanpa nama, setiap goroutine akan mempunyai salinan
Atas ialah kandungan terperinci Output Goroutine tidak betul. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!