go - 如何在 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)
}
解决方案
如果通道只能自由接收数据,那case c <- x:
将是成功的。c
并且它成功地发送了 的值x
,然后x
' 的值通过 line 更改为y
' 的先前值x, y = y, x+y
并填充斐波那契。
这样,如果通道没有接收者c
,则不会发生阻塞,因为循环总是继续并在退出通道接收到值时退出。
在 main 函数中,goroutine 通道内部接收从 select case 发送的消息,并为新消息释放通道。
请参阅此示例以获得更多理解。
推荐阅读
- linux - 从 SMIL 文件中提取 jpeg
- r - 用列表替换列表中的项目
- c - 父进程只从其子进程中收到一次或两次 SIGCHLD,不管它 fork() 多少次
- mysql - 具有动态连接的联合表
- asp.net-core-middleware - .Net Core 2.1 自定义中间件问题与身份验证
- active-directory - 本地活动目录使用 API 创建/删除用户
- html - 如何让rails图像标签垂直显示
- javascript - 无法将文件上传到服务器页面
- ruby-on-rails - docker-compose rails 未绑定端口 80
- google-chrome - Nginx 反向代理 405 PUT Chrome