为了账号安全,请及时绑定邮箱和手机立即绑定

Goroutines select with range loop

Goroutines select with range loop

Go
慕工程0101907 2023-05-15 15:14:00
我想生成一个 goroutine 来收听类型chan int和的两个通道chan os.Signal。我希望行为具体取决于在任一渠道上收到的内容。这意味着有些os.Signal可能会导致os.exit(),有些可能不会,有些int接收到的chan int可能会打印一条语句,有些可能会调用一个函数,所以我需要这个 gorountine 始终运行,因为行为不同。我希望这一切都由一个函数处理。我很难弄清楚如何在语法上实现这一目标。似乎我不能在块range内有循环select,我也不能在循环select内有块range。我在网上找不到任何资源。有人可以给我举个例子吗?
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您可以将select语句放入循环中for(这是语言规范中的示例之一)。与循环不同for...range,这将让您从两个通道读取。如果其中一个通道关闭,它也不会自动终止。当您从关闭的通道接收时,关闭的通道始终准备好接收并始终产生零值,并且它有一个二值形式告诉您通道是否打开。


你的功能可能看起来像


func HandleStuff(numbers <-chan int, signals <-chan os.Signal) {

    var goingToExit bool

    for {

        select {

        case n := <-numbers:

            if n == 0 {

                fmt.Printf("zero\n")

            } else if n == 1 {

                goingToExit = true

            }

        case sig, ok := <-signals:

            if !ok { // the channel is closed

                return

            } else if goingToExit {

                os.Exit(0)

            }

        }

    }

}


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信