Pergi pilih Penyelesaian Keutamaan Penyata
Pertimbangkan senario berikut: anda mahu rutin Go memantau dua saluran, kekal disekat apabila kedua-dua saluran berada kosong. Walau bagaimanapun, apabila kedua-dua saluran mengandungi data, anda mengutamakan penyaliran satu saluran sebelum menangani saluran yang lain.
Masalah Asal:
Dalam sampel kod yang disediakan, anda mempunyai saluran keluar dan saluran keluar. Anda mahu nilai habis-habis diproses sebelum mengendalikan isyarat keluar. Walau bagaimanapun, penyataan pilih tidak mempunyai mekanisme keutamaan terbina dalam.
Penyelesaian Penyelesaian:
Go secara asli menyokong keutamaan ini, menghapuskan keperluan untuk penyelesaian. Penyelesaiannya melibatkan menjadikan saluran berhenti hanya boleh diakses oleh pengeluar. Apabila pengeluar selesai, ia menutup saluran berhenti. Pengguna terus membaca dari saluran keluar sehingga ia kosong dan saluran keluar ditutup.
Begini rupa kod yang diubah suai:
package main import ( "fmt" "math/rand" "time" ) var ( produced = 0 processed = 0 ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { select { case <-quit: fmt.Println("RECV QUIT") return default: out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) produced++ } } } func main() { vals, quit := make(chan int, 10), make(chan bool) go produceEndlessly(vals, quit) for x := range vals { fmt.Println(x) processed++ time.Sleep(time.Duration(rand.Int63n(5e8))) } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
Penjelasan:
Dalam kod yang diubah suai, hanya goroutine pengeluar mempunyai akses kepada saluran berhenti. Apabila pengeluar selesai, ia menutup saluran berhenti. Goroutine pengguna meneruskan bacaan dari saluran keluar sehingga ia kosong dan saluran berhenti ditutup. Ini memastikan bahawa semua nilai diproses sebelum pengguna keluar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Bacaan Saluran dalam Penyata `pilih` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!