先看下面代码
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
go func() {
fmt.Println(<-ch1)
}()
ch1 <- 1
time.Sleep(time.Second)
}
一般来讲,可以正常运行,因为 go func()
的调度执行需要一点时间,而此时主 goruntine
继续往下执行,等到主 goruntine
执行发送通道操作 ch1 <- 1
后,又有一个等待时间,go func()
可以正常接收值。
但是下面这个例子:
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch1 <- 1
go func() {
fmt.Println(<-ch1)
}()
time.Sleep(time.Second)
}
在主 goruntine
中执行 ch1 <- 1
操作,就等于把主 goroutine
阻塞了。后面自定义的 go
语句根本还没来得及执行。所以会报错。
fatal error: all goroutines are asleep - deadlock!