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会随机选择一个。
  • 对于没有caseselect{}会一直等待,可用于阻塞main函数。
posted @ 2022-01-25 09:30  DarkH  阅读(325)  评论(0编辑  收藏  举报