Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup
Dalam Go, menggunakan pernyataan pilihan ialah cara yang cekap untuk mengendalikan berbilang saluran serentak. Walau bagaimanapun, apabila bekerja dengan saluran yang akhirnya ditutup, adalah perlu untuk mencari cara ringkas untuk menggelung sehingga semua saluran ditutup.
Mari kita pertimbangkan contoh berikut di mana dua gorout menghasilkan data secara bebas dan menghantarnya ke saluran. Goroutine utama menggunakan data ini tanpa mengambil kira pesanan.
for { select { case p, ok := <-mins: if ok { fmt.Println("Min:", p) } case p, ok := <-maxs: if ok { fmt.Println("Max:", p) } } }
Walaupun pernyataan pilihan ini membenarkan untuk menggunakan setiap output apabila ia tiba, tiada cara untuk keluar secara eksplisit daripada gelung apabila kedua-dua saluran telah ditutup.
Penyelesaian yang dicadangkan, yang melibatkan penjejakan status setiap saluran menggunakan bendera boolean, boleh menjadi sukar digunakan untuk sebilangan besar saluran.
Penyelesaian yang lebih elegan ialah menetapkan sifar kepada saluran apabila ia telah ditutup. Ini memastikan saluran sifar tidak dipilih untuk komunikasi.
for { select { case x, ok := <-ch: fmt.Println("ch1", x, ok) if !ok { ch = nil } case x, ok := <-ch2: fmt.Println("ch2", x, ok) if !ok { ch2 = nil } } if ch == nil && ch2 == nil { break } }
Dengan menggunakan saluran sifar, penyataan pilih akan melangkau saluran yang telah ditutup secara automatik. Apabila semua saluran telah ditutup, gelung akan pecah. Penyelesaian ini menyediakan cara yang bersih dan cekap untuk mengendalikan saluran penutupan dalam pernyataan terpilih, tanpa mengira bilangan saluran yang terlibat.
Atas ialah kandungan terperinci Bagaimana untuk Keluar daripada Penyata `pilih` Apabila Semua Saluran Ditutup dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!