当前位置: 首页 > 面试题库 >

如何收听N个频道?(动态选择语句)

白才艺
2023-03-14
问题内容

要开始执行两个goroutine的无限循环,我可以使用以下代码:

收到味精后,它将启动一个新的goroutine并永远继续下去。

c1 := make(chan string)
c2 := make(chan string)

go DoStuff(c1, 5)
go DoStuff(c2, 2)

for ; true;  {
    select {
    case msg1 := <-c1:
        fmt.Println("received ", msg1)
        go DoStuff(c1, 1)
    case msg2 := <-c2:
        fmt.Println("received ", msg2)
        go DoStuff(c2, 9)
    }
}

我现在想对N个goroutine具有相同的行为,但是在这种情况下select语句将如何显示?

这是我开始使用的代码,但是我对如何编写select语句感到困惑

numChans := 2

//I keep the channels in this slice, and want to "loop" over them in the select statemnt
var chans = [] chan string{}

for i:=0;i<numChans;i++{
    tmp := make(chan string);
    chans = append(chans, tmp);
    go DoStuff(tmp, i + 1)

//How shall the select statment be coded for this case?  
for ; true;  {
    select {
    case msg1 := <-c1:
        fmt.Println("received ", msg1)
        go DoStuff(c1, 1)
    case msg2 := <-c2:
        fmt.Println("received ", msg2)
        go DoStuff(c2, 9)
    }
}

问题答案:

您可以使用reflect包中的Select函数执行此操作:

func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)

Select执行案例列表中描述的选择操作。类似于Go
select语句,它阻塞直到至少一种情况可以继续进行,做出统一的伪随机选择然后执行该情况。它返回所选案例的索引,如果该案例是接收操作,则返回接收到的值和一个布尔值,指示该值是否对应于通道上的发送(而不是由于通道关闭而接收到的零值)。

您传递一个SelectCase结构数组,这些结构标识要选择的通道,操作的方向以及在发送操作的情况下要发送的值。

因此,您可以执行以下操作:

cases := make([]reflect.SelectCase, len(chans))
for i, ch := range chans {
    cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
}
chosen, value, ok := reflect.Select(cases)
// ok will be true if the channel has not been closed.
ch := chans[chosen]
msg := value.String()

您可以在此处尝试更加充实的示例:http :
//play.golang.org/p/8zwvSk4kjx



 类似资料:
  • 问题内容: 刚尝试去最近。我想知道如果您有一条select语句等待在几个通道上进行通信,并且如果消息同时在两个或多个通道上出现,将会发生什么情况。如果所有消息都同时发出,那么select将如何确定接受哪个通道? 谢谢! 问题答案: 从规格: 如果可能发生多种情况,则将做出统一的伪随机选择,以决定执行哪个单一通信。 因此,选择是不确定的。

  • 问题内容: 我有一个程序尝试为每个特工在表格中插入样本,每个特工的样本数量因某些计算而异 我到这里的错误是 消息4115,级别15,状态1,第4 行在TOP子句的参数中不允许引用列“ samplesize”。此处仅允许引用外部作用域的列或独立的表达式和子查询。 有没有解决方法? 任何帮助表示赞赏。 提前致谢。 问题答案: 您可以用来做基本上相同的事情: 您也许可以简化一下,但是我不知道它是否来自d

  • 问题内容: 当用户从一个选项卡转到另一个选项卡时,我想执行一些操作,因为我是通过SceneBuilder进行表单设计的,所以我无法使用提到的代码(他使用过类) 我猜想这段代码可以用,但是对选项卡选择的更改没有反应。 问题答案: 使用变更侦听器的正确方法是: 为什么有问题的代码行不通?我猜是因为您的更改侦听器在“ ”而不是“ ”中监听更改 了解何时添加或删除选项卡比较麻烦:

  • 在我的netty应用程序中,我使用并提供IP密钥映射: 在通道已经处于活动状态并为客户端服务而不中断与这些客户端的通信后,是否可以更改映射(例如添加新ip)?

  • 我希望我的机器人能够收听我当前使用的每个名为“disminer-2”的频道 我犯了一个错误 忽略on_消息回溯中的异常(最近一次调用):文件“/opt/virtualenvs/python3/lib/python3.8/site packages/discord/client.py”,第343行,in_run_事件等待coro(args,kwargs)文件“main.py”,第45行,in_消息等

  • 本文向大家介绍什么是动态频率选择(DFS)?,包括了什么是动态频率选择(DFS)?的使用技巧和注意事项,需要的朋友参考一下 动态频率选择(DFS)是IEEE 802.11无线网络或WiFi中使用的一种技术,该技术允许设备动态切换传输的工作频率以避免与其他设备发生干扰。 特征 对于与雷达共享5 GHz无线电频谱的所有IEEE 802.11设备,DFS是一项法定命令。 DFS已在IEEE 802.11