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中文网其他相关文章!