go语言select语句
select会选择一个可运行的case(每个case都必须是一个通信)运行。
chan1, chan2 := make(chan int, 1), make(chan int, 1)
select {
case chan1 <- 1:
fmt.Println("run chan1<-1")
case <-chan2:
fmt.Println("<-chan2")
}
/*
输出:run chan1<-1
*/
若有多个可运行的case语句则随机执行一个。
chan1, chan2 := make(chan int, 1), make(chan int, 1)
select {
case chan1 <- 1:
fmt.Println("run chan1<-1")
case chan2 <- 2:
fmt.Println("run chan2<-2")
}
/*
随机输出run chan1<-1或run chan2<-2
*/
如果没有 case 可运行且没有default,它将阻塞,直到有 case 可运行。
func selectFun(chan1 chan int, chan2 chan int) {
time.Sleep(time.Second)
chan1 <- 1
}
func main() {
chan1, chan2 := make(chan int, 1), make(chan int, 1)
go selectFun(chan1, chan2)
select {
case <-chan1:
fmt.Println("run <-chan1")
case <-chan2:
fmt.Println("run <-chan2")
default:
fmt.Println("run default")
}
}
/*
过一秒后输出: run <-chan1
*/
有default语句时运行default的内容
func selectFun(chan1 chan int, chan2 chan int) {
time.Sleep(time.Second)
chan1 <- 1
}
func main() {
chan1, chan2 := make(chan int, 1), make(chan int, 1)
go selectFun(chan1, chan2)
select {
case <-chan1:
fmt.Println("run <-chan1")
case <-chan2:
fmt.Println("run <-chan2")
default:
fmt.Println("run default")
}
}
/*
输出:run default
*/