select
select
当程序有多个channel协同工作,ch1,ch2,某一时刻,ch1或者ch2触发了,程序要做响应的处理。使用select来监听多个通道,当管道被触发时(写入数据,读取数据,关闭管道)。
select语法与switch case很像,但是所有的分支条件都必须是通道IO。它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送或者关闭)过程。select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句。具体格式如下:
select{
    case <-ch1:
        ...
    case data := <-ch2:
        ...
    case ch3<-data:
        ...
    default:
        默认操作
}
列子:
package main
import (
	"fmt"
	"time"
)
func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	//开一个goroutine往ch1写数据
	go func() {
		for i := 0; i < 10; i++ {
			ch1 <- i
			time.Sleep(time.Second / 2)
		}
	}()
	//开一个goroutine往ch2写数据
	go func() {
		for i := 0; i < 10; i++ {
			ch2 <- i
			time.Sleep(time.Second)
		}
	}()
	for {
		select {
		case data1 := <-ch1:
			fmt.Println("从ch1读取数据成功,data1:", data1)
		case data2 := <-ch2:
			fmt.Println("从ch2读取数据成功,data2:", data2)
		default:
			fmt.Println("select default分支called")
			time.Sleep(time.Second)
		}
	}
}
使用select语句能提高代码的可读性。
- 可处理一个或多个channel的发送/接收操作。
- 如果多个case同时满足,select会随机选择一个。
- 对于没有case的select{}会一直等待,可用于阻塞main函数。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号