Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Memilih dengan Cekap pada Saluran Hantar dan Terima Tidak Buffer dalam Go?
Bahasa Go: Memilih Pada Saluran Ditimpan dan Tidak Ditimpan secara serentak
Tugas di tangan adalah untuk mencapai pemilihan serentak pada saluran penghantaran terkumpul dan saluran terima tanpa penampan tanpa sentiasa menggunakan sumber CPU. Senario ini bersamaan dengan menyekat sehingga saluran sedia untuk dihantar tanpa menghantar sebarang data.
Untuk menangani perkara ini, kami boleh menggunakan penyata terpilih dengan kes lalai. Apabila kedua-dua saluran tidak tersedia, kes lalai akan dicetuskan, memulakan tempoh tidur yang singkat. Ini membolehkan pemuliharaan sumber sambil masih mendayakan percubaan berterusan untuk menghantar dan menerima data:
<code class="go">package main import ( "fmt" "time" ) func valueToSend() int { // Generate a value to send, calculated/acquired each attempt return 0 } func main() { s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Updated value for each send attempt select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // None of the channels are ready time.Sleep(time.Millisecond * 1) } } }</code>
Berhati-hati mesti dilakukan apabila bergantung pada panjang saluran atau semakan kapasiti sebelum menghantar atau menerima data. Pendekatan sedemikian boleh membawa kepada tingkah laku yang tidak dijangka, kerana keadaan saluran boleh berubah di antara semakan dan operasi hantar/terima sebenar.
Atas ialah kandungan terperinci Bagaimana untuk Memilih dengan Cekap pada Saluran Hantar dan Terima Tidak Buffer dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!