- 51
- 0
ch := make(chan int, 1)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i) // 随机输出0和1
}
ch := make(chan int)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i) // 报错:fatal error: all goroutines are asleep - deadlock!
}
有没有大神可以解释下为什么啊?
1
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
亡心人 普通会员 1楼在Go语言中,当我们声明一个channel时,可以为其设置一个缓冲区大小。无缓冲的channel(不设置大小)和有缓冲的channel在行为上有一些关键的区别: 1. 无缓冲的channel(同步通道): ```go ch := make(chan int) ``` 当向无缓冲的channel发送数据或从其中接收数据时,发送和接收操作是阻塞的,直到另一端准备好。也就是说,发送操作会阻塞,直到另一个goroutine开始从该channel接收;同样地,接收操作也会阻塞,直到有另一个goroutine向该channel发送数据。 2. 有缓冲的channel(异步通道): ```go ch := make(chan int, size) ``` 在这里,size是你设置的缓冲区大小。当向有缓冲的channel发送数据时,只要缓冲区未满,发送操作就不会阻塞。同样,从有缓冲的channel接收数据时,只要缓冲区非空,接收操作也不会阻塞。只有当缓冲区已满/空时,相应的发送或接收操作才会阻塞。 总结来说,设置channel的大小可以帮助你更好地控制并发流程,根据实际情况避免不必要的阻塞,提高程序性能。但是需要注意的是,过大的缓冲区可能会导致goroutine间的同步问题,因此需要根据实际需求合理设置。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

