select用于处理多个ch。
其所有case中的channel表达式和右侧的发送语句都会被计算(从上到下)
如果多个case都可以执行,则随机选择一个case。
func test_select_recv() { ch := make(chan int) go func() { fmt.Println("select begin") select { case v := <-ch: fmt.Println("recv 1:", v) case v := <-ch: fmt.Println("recv 2:", v) // default: // fmt.Println("default nothing") } fmt.Println("select done") }() ch <- 1 }
两个case随机一个执行。
如果ch没有收到数据,则select阻塞。
如果有default并且没有case可执行,则执行default
func test_select_send() { ch := make(chan int) go func() { select { case ch <- func() int { fmt.Println("get 1") return 1 }(): fmt.Println("send 1") case ch <- func() int { fmt.Println("get 2") return 2 }(): fmt.Println("send 2") } }() v := <-ch fmt.Println("recv: ", v) }输出:
get 1
get 2
send 1
recv: 1
可以看到两个发送channel后面的函数都执行了, 随机选一个send
select {} //block forever