select功能:解决多个管道的选择问题,也可以叫多路复用,可以从多个管道中随机公平的选择一个来执行
case后面必须进行的是io操作,不能是等值,随机去选择一个io操作
default防止select被阻塞,加入default
只要有其中一个满足条件,就执行相应的逻辑,一般会写个for,里面加入select进行监听多个channel,如果有数据就执行对应的逻辑操作
package main
import (
"fmt"
"time"
)
func main() {
//定义一个int管道:
intChan := make(chan int, 1)
go func() {
time.Sleep(time.Second * 5)
intChan <- 10
}()
//定义一个string管道
stringChan := make(chan string, 1)
go func() {
time.Sleep(time.Second * 10)
stringChan <- "golang"
}()
//fmt.Println(<-intChan) //本身取数据就是阻塞的
select {
case v := <-intChan:
fmt.Println("intChan:", v)
case v := <-stringChan:
fmt.Println("stringChan:", v)
default:
fmt.Println("防止select被阻塞")
}
}