Goroutines使用范围循环选择

Goroutines使用范围循环选择,go,concurrency,channel,goroutine,Go,Concurrency,Channel,Goroutine,我想生成一个goroutine来收听两个类型为chan int和chan os.Signal的频道。我希望行为是特定的,取决于在任一频道上接收到的内容。也就是说,一些os.Signal可能会导致os.exit()而一些可能不会,一些通过chan int接收的int可能会打印语句,一些可能会调用函数,因此我需要此goruntine始终运行,因为行为不同。我希望这一切都由一个函数来处理 我很难弄明白如何在语法上达到这个目的。似乎我不能在select块内有range循环,也不能在range循环内有se

我想生成一个goroutine来收听两个类型为
chan int
chan os.Signal
的频道。我希望行为是特定的,取决于在任一频道上接收到的内容。也就是说,一些
os.Signal
可能会导致
os.exit()
而一些可能不会,一些通过
chan int
接收的
int
可能会打印语句,一些可能会调用函数,因此我需要此goruntine始终运行,因为行为不同。我希望这一切都由一个函数来处理

我很难弄明白如何在语法上达到这个目的。似乎我不能在
select
块内有
range
循环,也不能在
range
循环内有
select
块。我在网上找不到这方面的任何资源。有人能给我举个例子吗?

你可以在
for
循环中加入一个(这是语言规范中的一个例子)。与…范围的
循环不同,这将允许您从两个通道进行读取。如果其中一个通道关闭,它也不会自动终止。当你打开时,一个封闭的通道总是准备好接收,并且总是产生一个零值,它有一个二值形式,告诉你通道是否开放

您的函数可能大致如下所示

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)
            }
        }
    }
}

func HandleStuff(数字这正是我要找的,谢谢!你能提供一个代码示例(即使它不完整)来告诉我们你想弄明白什么吗?即使它是伪代码,它仍然会有帮助,我们会更容易回答你的问题。