首页 > 解决方案 > 如何在 Go select statemnet 中评估案例

问题描述

下面是A tour of Go演示select在 Go 中使用语句的代码。

func fibonacci(c, quit chan int) {
 x, y := 0, 1
 for {
    select {
    case c <- x:
        x, y = y, x+y

    case <-quit:
        return
    }
  }
}

我的问题是:

在这里做什么 case c <-x?是一些数据x正在发送到通道,或者我们正在寻找一些数据正在发送到通道的条件。

如果某些数据正在发送到循环,则循环永远不会结束,并且如果评估发送到通道的数据的条件,我看不到任何数据正在发送到通道。

main功能是:

 func main() {
   c := make(chan int)
   quit := make(chan int)
   go func() {
    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
    quit <- 0
  }()
 fibonacci(c, quit)
}

标签: go

解决方案


如果通道只能自由接收数据,那case c <- x:将是成功的。c并且它成功地发送了 的值x,然后x' 的值通过 line 更改为y' 的先前值x, y = y, x+y并填充斐波那契。

这样,如果通道没有接收者c,则不会发生阻塞,因为循环总是继续并在退出通道接收到值时退出。

在 main 函数中,goroutine 通道内部接收从 se​​lect case 发送的消息,并为新消息释放通道。

请参阅此示例以获得更多理解。


推荐阅读