Apabila bekerja dengan saluran dalam Go, adalah penting untuk menentukan masa yang sesuai untuk menutupnya. Ini memberikan cabaran apabila panjang saluran tidak diketahui.
Pertimbangkan senario berikut:
package main import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { for i := 0; i < 100; i++ { ch <- i } close(ch) }() for v := range ch { fmt.Println(v) } }
Dalam contoh ini, goroutine menghantar 100 nilai ke saluran, dengan niat untuk menutupnya apabila semua nilai telah dihantar. Walau bagaimanapun, pendekatan ini menimbulkan kebimbangan. Khususnya:
Untuk menangani isu ini, penyegerakan.WaitGroup boleh digunakan untuk menyegerakkan penutupan saluran dengan penyiapan goroutine penghantaran.
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup ch := make(chan int) wg.Add(1) // Increment counter for sender goroutine go func() { defer wg.Done() // Decrement counter when goroutine completes for i := 0; i < 100; i++ { ch <- i } close(ch) }() go func() { wg.Wait() // Wait until the sender goroutine completes close(ch) // Close the channel after all values have been sent }() for v := range ch { fmt.Println(v) } }
Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Go yang Tidak Diketahui Panjangnya dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!