Go 語言:同時選擇緩衝和非緩衝通道
目前的任務是實現緩衝發送通道和非緩衝通道的同時選擇無緩衝接收通道,無需不斷消耗CPU資源。這種情況相當於阻塞,直到通道準備好發送而不傳輸任何資料。
為了解決這個問題,我們可以使用帶有預設情況的 select 語句。當兩個通道都沒有準備好時,將觸發預設情況,啟動短暫的睡眠持續時間。這可以節省資源,同時仍然可以連續嘗試發送和接收資料:
<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>
在發送或接收資料之前依賴通道長度或容量檢查時必須小心。這種方法可能會導致意外的行為,因為通道狀態可能會在檢查和實際發送/接收操作之間發生變化。
以上是如何在 Go 中有效選擇緩衝發送和非緩衝接收通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!