Mengapa Menerima Nilai daripada Saluran Tertutup Adalah Mungkin
Dalam Go, saluran menyediakan mekanisme komunikasi antara goroutine. Apabila saluran ditutup, ia menunjukkan bahawa tiada lagi nilai akan dihantar. Walau bagaimanapun, ini tidak bermakna bahawa nilai sedia ada dalam penimbal saluran akan dibuang serta-merta.
Spesifikasi menyatakan bahawa selepas menutup saluran, sebarang nilai yang dihantar sebelum ini masih boleh diterima sebelum menerima nilai sifar. Ini kerana penimbal saluran bertindak sebagai baris gilir, menyimpan nilai yang dihantar sebelum operasi tutup.
Cara Ia Berfungsi:
Pertimbangkan kod berikut:
package main import "fmt" import "sync" import "time" func main() { iCh := make(chan int, 99) var wg sync.WaitGroup go func() { for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() iCh <- i }(i) } wg.Wait() close(iCh) }() time.Sleep(5 * time.Second) for i := range iCh { fmt.Printf("%v\n", i) } }
Output:
0 1 2 3 4
Walaupun saluran ditutup selepas 5 saat, gelung for masih menerima 5 nilai yang dihantar sebelum operasi tutup. Ini kerana penimbal saluran menyimpan nilai ini sehingga ia digunakan.
Hanya selepas menerima semua nilai yang dihantar sebelum ini, gelung for akan mengembalikan nilai sifar, menunjukkan bahawa saluran ditutup.
Mengapa Helah "Time.Sleep" Gagal:
Helah "time.Sleep" berkesan tidak menghalang goroutine daripada terus menghantar nilai ke saluran sebelum ia ditutup. Semasa goroutine sedang tidur selama 5 saat, mereka mungkin menghantar nilai tambahan yang masih akan ditimbal dan diterima oleh gelung untuk.
Atas ialah kandungan terperinci Mengapakah Saya Masih Boleh Menerima Nilai daripada Saluran Go Tertutup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!