Menutup Saluran Tidak Diketahui Panjang
Dalam kod yang disediakan, ralat "hantar pada saluran tertutup" berlaku kerana berbilang goroutine cuba menghantar nilai pada saluran yang telah ditutup. Isu ini timbul daripada kekurangan penyegerakan antara goroutine, kerana satu goroutine menutup saluran sementara yang lain masih menghantar data.
Untuk menutup saluran dengan berkesan dalam situasi ini, adalah penting untuk menentukan bila semua goroutine penghantar telah menyelesaikan tugasan mereka. Ini boleh dicapai menggunakan penyegerakan.WaitGroup untuk mengesan apabila semua gorout penghantar selesai menghantar nilai.
Berikut ialah kod diubah suai yang menggunakan penyegerakan.WaitGroup:
func gen(ch chan int, wg *sync.WaitGroup) { defer wg.Done() var i int for { time.Sleep(time.Millisecond * 10) ch <- i i++ // when no more data (e.g. from db, or event stream) if i > 100 { break } } } func receiver(ch chan int) { for i := range ch { fmt.Println("received:", i) } } func main() { ch := make(chan int) wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go gen(ch, wg) } go func() { wg.Wait() close(ch) }() receiver(ch) }
Dalam penyelesaian ini, setiap goroutine penghantar menambah satu pada penyegerakan.WaitGroup untuk menunjukkan bahawa ia akan menghantar nilai pada saluran. The wg.Wait() in the close() goroutine memastikan saluran ditutup hanya selepas semua goroutine penghantar telah menyelesaikan tugas mereka, menghalang ralat "hantar pada saluran tertutup".
Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Panjang Tidak Diketahui dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!