select 调度疑惑
来源:11-4 用select进行调度

慕妹2184772
2020-06-18
老师好,我在学习select调度时有点疑惑:
messages := make(chan string)
signals := make(chan bool)
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
select {e
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
你看第二段 给 msg 赋值 “hi” 以后,按理已经有值了,为啥没能捕获到(没有输出 sent message hi)
写回答
1回答
-
选择一个分支的条件不是msg有值。而是有人同时在收发。这里是向messages发送msg,那么必须有人收,才有可能被选中。反之,如果是下面的接收值case msg := <-messages,则必须有人发,才会被选中。
这里的select需要放在各自的goroutine中,才能完成收发动作。
012020-06-18
相似问题