先上代码,是Go by Example的例子演化的:
// go 1.9
package main
import "fmt"
import "time"
func main() {
messages := make(chan string)
go func() {
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")
}
time.Sleep(time.Second)
}
注释default
的代码块时打印:
received message hi
sent message hi
取消注释后一直打印:
no message sent
no message received
问题是取消注释为什么不打印:
received message hi
sent message hi
毕竟case messages <- msg
一直是有效的呀.
跟这两个goroutine的执行顺序有关即其中的select条件是否就绪有关.