下面的代码
func main () {
c1 := make(chan [0]int)
c1 <- [0]int{}
b := <-c1
fmt.Println(b)
}
会报错,fatal error: all goroutines are asleep - deadlock!
但是如果这样写就没问题
func main () {
c1 := make(chan [0]int)
go func() {
c1 <- [0]int{}
}()
b := <-c1
fmt.Println(b)
}
也就是说,如果在主协程里往管道输入并且在主协程里输出的话,会报死锁。但是如果在子协程里面往管道里面写然后再主协程里面读取的话就没问题,这一点让我很疑惑还请各位大佬帮忙解释一下
没有 buffer 的 channel 必须同时有人读写的,读写操作才能继续,否则就会等待。
读写写在同一个 goroutine ,没办法做到同时。于是在第一个写就等待锁住了,因为没有人读;然后读语句没有执行机会。
Receive Operator
Send Statement
Send statements