Select用法

时间:2020-12-18 12:55:43   收藏:0   阅读:3

Select用法

技术图片

Go里面提供了一个关键字select,通过select可以监听channel上的数据流动。
select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。
与switch语句相比, select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作,大致的结构如下

select {
    case <-chan1:
        // 如果chan1成功读到数据,则进行该case处理语句
    case chan2 <- 1:
        // 如果成功向chan2写入数据,则进行该case处理语句
    default:
        // 如果上面都没有成功,则进入default处理流程
}

普通的代码

package main

import (
	"fmt"
	"time"
)

func WorkHere(quit chan interface{}) {
	for {
		select {
		case <-quit:
			fmt.Println("over")
			return
		default:
			time.Sleep(time.Millisecond * 100)
			fmt.Println("work")
		}
	}
}

func main() {
	var (
		quit chan interface{}
	)
	quit = make(chan interface{})
	go WorkHere(quit)
	time.Sleep(2 * time.Second)
	quit<- "quit"
}

# 输出
work
work
..........此处省略一万字
work
work
over

小结

用法: 参考 switch case 语句。 但!case后面必须是IO操作,不可以任意写判别表达式。

注意事项:
    1. 监听的case中,没有满足监听条件,阻塞。

    2. 监听的case中,有多个满足监听条件,任选一个执行。

    3. 可以使用default来处理所有case都不满足监听条件的状况。 通常不用(会产生忙轮询)

    4. select 自身不带有循环机制,需借助外层 for 来循环监听

    5. break 跳出 select中的一个case选项 。类似于switch中的用法。
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!