Rumah >pembangunan bahagian belakang >Golang >Mengapa Go Goroutines Dilancarkan dalam Gelung Untuk dengan Fungsi Tanpa Nama Semua Mencetak Nilai Yang Sama?

Mengapa Go Goroutines Dilancarkan dalam Gelung Untuk dengan Fungsi Tanpa Nama Semua Mencetak Nilai Yang Sama?

Linda Hamilton
Linda Hamiltonasal
2024-11-23 18:22:17395semak imbas

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

Gelagat Tidak Dijangka Go Concurrency dengan for Gelung dan Fungsi Tanpa Nama

Dalam Go concurrency, adalah penting untuk memahami gelagat fungsi tanpa nama apabila dilancarkan sebagai goroutine. Ini ditunjukkan semasa cuba menggunakan penyegerakan.WaitGroup untuk menunggu berbilang gorouti untuk melengkapkan muat naik Amazon S3.

Kod awal menggunakan gelung for untuk melancarkan gorouti, tetapi output secara mengejutkan menunjukkan semua gorouti mencetak nilai yang sama ( 6). Ini berlaku kerana goroutine tidak dijadualkan sehingga selepas gelung for selesai, jadi nilai i ialah 6 apabila ia dilaksanakan.

Kod telah diubah suai untuk menghantar i sebagai hujah kepada fungsi tanpa nama, menghasilkan tingkah laku yang diingini. Ini kerana lulus i mencipta pembolehubah baharu dan menangkap nilai pada masa seruan.

Tingkah laku ini sejajar dengan Soalan Lazim Go, yang menyatakan bahawa apabila fungsi tanpa nama dilancarkan sebagai goroutine, ia menangkap keadaan pembolehubah sekelilingnya pada masa penciptaan. Melepasi i sebagai hujah dengan berkesan menyalin nilai pada masa itu.

Oleh itu, apabila menggunakan fungsi tanpa nama dalam goroutine, adalah penting untuk mempertimbangkan gelagat penutupan dan menggunakan teknik seperti hantaran nilai untuk mencapai gelagat serentak yang diingini.

Atas ialah kandungan terperinci Mengapa Go Goroutines Dilancarkan dalam Gelung Untuk dengan Fungsi Tanpa Nama Semua Mencetak Nilai Yang Sama?. 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