在 Go 中,可以使用 select 語句在通道上執行非阻塞 I/O 操作。然而,在處理緩衝發送通道(chan
一種常見的方法是在發送或接收之前檢查通道的長度或容量。但是,這是不可靠的,因為通道的狀態可能會在檢查和後續操作之間發生變化:
<code class="go">if len(r) > 0 { // Optionally execute other code r <- v // May block if another goroutine received from r in the meantime }</code>
要要解決此問題,您可以使用包含短時間延遲的預設情況的select 語句。這可以防止過度的CPU 使用,同時允許您在兩個通道都沒有準備好時重試操作:
<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>
透過添加預設情況,如果兩個通道都沒有準備好,程式只會阻塞一小段時間,允許在等待通道可用時釋放CPU 資源。
以上是如何在 Go 中同時選擇緩衝發送和無緩衝接收通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!