選擇雙向通道進行條件發送和接收
在Go 中,可以為發送和接收設定緩衝通道,允許根據其可用性進行選擇性操作。考慮以下場景:
<code class="go">s := make(chan<p>我們有一個緩衝的發送通道 s 和一個無緩衝的接收通道 r。問題來了:我們能否在兩個通道上進行選擇來確定 r 是否有資料或 s 是否未滿?這模仿了以下功能,但不消耗100% CPU:</p> <pre class="brush:php;toolbar:false"><code class="go">for { if len(s) 0 { // Receive something } }</code>
使用預設情況實現Select
要實現這一點,我們可以利用具有預設情況的select 語句。預設情況下,如果兩個通道都沒有準備好,我們會暫時「睡眠」goroutine,以避免不必要的資源消耗。
<code class="go">s := make(chan<p><strong>為什麼長度和容量檢查不理想</strong></p> <p>在嘗試發送或接收之前避免檢查通道的長度或容量至關重要。這是因為通道的狀態可能在檢查時間和實際操作之間發生變化,可能導致意外阻塞。例如:</p> <pre class="brush:php;toolbar:false"><code class="go">if len(r) > 0 { // r is ready to receive // Other code... r </code>
以上是可以在Go中同時選擇發送和接收通道而不阻塞嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!