Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup
Pertimbangkan senario di mana berbilang goroutine menghantar data ke saluran individu dan anda mahu untuk menggunakan data ini dalam susunan sewenang-wenangnya. Menggunakan pernyataan pilih menawarkan cara yang mudah untuk mengendalikan input serentak daripada pelbagai sumber. Walau bagaimanapun, cabaran timbul apabila anda perlu keluar dari gelung hanya apabila semua saluran ditutup.
Penyelesaian Naif
Pendekatan intuitif mungkin melibatkan menyemak ketersediaan setiap saluran dengan menggunakan bendera ok. Walau bagaimanapun, penyelesaian ini terdedah kepada ralat kerana saluran tertutup tersedia semula jika ia dipilih. Ini membawa kepada gelung tak terhingga, seperti yang ditunjukkan dalam contoh taman permainan ini: http://play.golang.org/p/rOjdvnji49.
Penyelesaian yang Diperbaiki
Lagi pendekatan yang berkesan adalah dengan menggunakan fakta bahawa saluran nihil tidak pernah bersedia untuk komunikasi. Setiap kali saluran ditutup, saluran itu boleh ditetapkan kepada sifar, memastikan saluran itu dikecualikan daripada penyata pilihan masa hadapan. Ini menjamin bahawa gelung hanya ditamatkan apabila semua saluran telah ditutup:
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 } }
Contoh taman permainan: http://play.golang.org/p/8lkV_Hffyj
Pertimbangan Praktikal
Dalam amalan, tidak mungkin anda perlu mengendalikan sejumlah besar saluran dalam satu penyataan pilihan. Jika senario sedemikian timbul, anda dinasihatkan untuk menggunakan penyelesaian yang lebih khusus, seperti pemultipleks saluran, untuk mengelakkan kekacauan kod dengan semakan sifar yang berlebihan.
Atas ialah kandungan terperinci Bagaimana Memecahkan Penyata Pilihan Apabila Semua Saluran Ditutup dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!