我知道在 golang 中生成 goroutine 非常便宜,但出于好奇 - 假设我们有这个:
go func() {
for {
select {
case <-stop:
return // Stop goroutine when stop signal is received
default:
// Read from each channel
for _, ch := range channels {
select {
case val := <-ch:
fmt.Printf("Received from channel: %d\n", val)
default:
// If channel is empty, continue to the next channel
}
}
time.Sleep(time.Millisecond * 100) // Add a short delay to prevent busy-waiting
}
}
}()
在上面,我们有一个动态列表(频道),但它将按顺序阻止每个频道。我正在寻找的基本上是一个“动态选择”语句,它具有动态数量的 case 语句(在编译时不存在)。
可能没有必要避免为每个通道创建不同的 goroutine,但此时我只是好奇是否可能
可以使用
reflect.Select
:
chn1:=reflect.ValueOf(channel1)
...
cases:=[]reflect.SelectCase{
{
Dir: reflect.SelectRecv,
Chan: chn1,
},
{
Dir: reflect.SelectRecv,
Chan: chn2,
}
}
...
chosen, value, ok:=reflect.Select(cases)