Dalam Go, adalah mungkin untuk melakukan operasi I/O tanpa sekatan pada saluran menggunakan pernyataan pilih. Walau bagaimanapun, persoalan biasa timbul apabila berurusan dengan saluran penghantaran terbuffer (chan<-) dan saluran penerimaan yang tidak ditimbal (<-chan): bagaimana anda boleh memilih pada kedua-dua saluran secara serentak, mengutamakan saluran terima jika ia mempunyai data dan penghantaran saluran jika ia mempunyai kapasiti?
Satu pendekatan biasa ialah menyemak panjang atau kapasiti saluran sebelum menghantar atau menerima. Walau bagaimanapun, ini tidak boleh dipercayai kerana keadaan saluran boleh berubah antara semakan dan operasi seterusnya:
<code class="go">if len(r) > 0 { // Optionally execute other code r <- v // May block if another goroutine received from r in the meantime }</p> <h3>Penyelesaian: Kes Lalai dengan Kelewatan Masa</h3> <p>Untuk menyelesaikan isu ini, anda boleh gunakan pernyataan pilih dengan kes lalai yang termasuk kelewatan masa yang singkat. Ini menghalang penggunaan CPU yang berlebihan sambil membenarkan anda mencuba semula operasi jika kedua-dua saluran tidak bersedia:</p> <pre class="brush:php;toolbar:false"><code class="go">s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // If none are ready, delay execution time.Sleep(time.Millisecond * 1) } }</code>
Dengan menambahkan kes lalai, program hanya akan menyekat untuk tempoh yang singkat jika kedua-dua saluran tidak bersedia, membenarkan sumber CPU dikeluarkan sementara ia menunggu saluran tersedia.
Atas ialah kandungan terperinci Bagaimana untuk Memilih pada Saluran Hantar Buffer dan Saluran Terima Tanpa Buffer Secara Serentak dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!