package main
import "fmt"
func main() {
out := make(chan int)
out <- 2
fmt.Println(<-out)
}
上面的代码一运行就有错fatal error:all goroutines are asleep-deadlock
如果将chan的初始化改为
out:=make(chan int, 1)
就可以。
为什么?
package main
import "fmt"
func main() {
out := make(chan int)
out <- 2
fmt.Println(<-out)
}
上面的代码一运行就有错fatal error:all goroutines are asleep-deadlock
如果将chan的初始化改为
out:=make(chan int, 1)
就可以。
为什么?
我的理解是,chan不同于变量
变量是你可以先放进去,再取出来。
但是chan在是一个通信工具,如果没人取,你就放不进去。
比如电话,没人接你就打不通。但是比如微信你就可以先录进去对方以后再听。
无缓冲的channel,如题主的代码。
当在向一个无缓冲的channel发送数据时,代码会阻塞直到有另一个goroutine接收这个channel。
楼上的解释很形象,就像你打电话,你拨过去就等着人接,那边没人接你就一直等,所以阻塞了。
所以改进方法就是,先开启一个goroutine去电话那头等着接电话,然后你再拨号,这样两边就通了,然后故事继续
func haha(ch chan int) {
num := <-ch
fmt.Println(num)
}
func main() {
ch := make(chan int)
ch <- 2
//.....
}
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
2 回答2k 阅读✓ 已解决
1 回答3.3k 阅读
2 回答894 阅读✓ 已解决
2 回答2.2k 阅读
因为默认无缓冲的channel是阻塞的,在
out <- 2
这一句会阻塞等待其它goroutine从out读取
然而并没有其他goroutine