Apakah yang Berlaku untuk Mengembalikan Nilai daripada Goroutines?
Apabila menggunakan fungsi daripada goroutine, nilai yang dikembalikan biasanya hilang kerana goroutine mempunyai persekitaran pelaksanaan terpencil sendiri. Walaupun fungsi mungkin menyimpan nilainya yang dikembalikan pada tindanan, tindanan ini berasingan daripada tindanan program utama dan dimusnahkan apabila goroutine keluar.
Analisis Nilai Pulangan Fungsi
Memeriksa output pemasangan untuk fungsi getNumber menggunakan bendera -gcflags -S mendedahkan bahawa ia menyimpan nilai yang dikembalikan pada tindanan:
"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0 0x0000 00000 (z.go:5) TEXT "".getNumber+0(SB),4,<pre class="brush:php;toolbar:false">func getNumber(i int) int { return i } func main() { for i := 0; i < 10; i++ { go printNumber(i) } time.Sleep(5) }
Walau bagaimanapun, nilai ini disimpan pada tindanan baharu dalam goroutine, yang kemudiannya dimusnahkan apabila goroutine ditamatkan, menjadikan nilai pulangan tidak boleh diakses daripada program utama.
Contoh
Pertimbangkan perkara berikut kod:
func getNumber(i int) chan int { ch := make(chan int) go func() { ch <- i }() return ch } func main() { for i := 0; i < 10; i++ { ch := getNumber(i) num := <-ch fmt.Println(num) } time.Sleep(5) }
Dalam contoh ini, fungsi getNumber digunakan sebagai goroutine dan nilai pulangannya tidak boleh digunakan serta-merta kerana ia disimpan pada tindanan berasingan.
Sepatutnya Kami Mengelak Nilai Pulangan dalam Goroutines?
Untuk mengelakkan kehilangan nilai pulangan, biasanya disyorkan untuk menggunakan mekanisme komunikasi seperti saluran untuk berkongsi data antara goroutine dan program utama:
Atas ialah kandungan terperinci Apakah yang Berlaku kepada Nilai Pulangan Fungsi yang Dipanggil dalam Goroutines?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!