有一段很小的程序,是这样的:
m := make(chan bool, 0)
m <- true
v, ok := <-m
fmt.Println(v, ok)
设置一个channel,存一个true,再取出来,报错了:
fatal error: all goroutines are asleep - deadlock!
但是,如果我把 m<-true,改成如下:
go func(){
m<-true
}();
就可以执行了。
我的理解是,channel大小为0,那么存进去一个必须要取出来,两种方式都是取,为何goruntine才可以?
另外,v,ok := <-m中,ok什么情况下为false?
我的理解是,大小为0即channel使阻塞的,所以不能发送数据,所以必须重新启用一个goroutine来给m写入数据。
新手理解,不喜勿喷+——+
#4
更多评论
大小为 0(跟不知道大小是一样的),这时channel是阻塞的,写和读必须在两个goroutine中;channel 关闭时,ok 会返回 false
#1