blocking.go
package main
import (
"fmt"
)
func f1(in chan int) {
fmt.Println(<-in)
}
func main() {
out := make(chan int)
out <- 2
go f1(out)
}
定义通道时如果不传第二个值,那这个通道就是无缓冲通道,如果接收者未准备好接受数据,那这个通道就是阻塞的,所以要把f1
放到out <- 2
上边,同时如果f1
没用go
关键字启动协程的话会一直等待数据,同样造成阻塞。
定义通道时如果不传第二个值,那这个通道就是无缓冲通道,如果接收者未准备好接受数据,那这个通道就是阻塞的
这句话说的是,如果接收者没有准备好,那消息就不会发送出去,这个操作不会成功并且会阻塞在这里。所以会报deadlock。