Select语句的简单应用

本文详细介绍了Go语言中的select语句如何用于监听和管理channel的IO操作,强调了其在goroutine间通信和同步中的作用。通过示例代码展示了select在处理多个channel读写情况下的工作原理,包括超时处理和随机性读取。此外,还演示了如何在实际场景中使用select实现条件判断和流程控制。
摘要由CSDN通过智能技术生成

在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。有了 select语句,可以实现 main主线程 与 goroutine线程 之间的互动。

select {
    case <-ch1 :     // 检测有没有数据可读
        // 一旦成功读取到数据,则进行该case处理语句
    case ch2 <- 1 :  // 检测有没有数据可写
        // 一旦成功向ch2写入数据,则进行该case处理语句
    default:
        // 如果以上都没有符合条件,那么进入default处理流程
}

下面看几个简单的例子:

func SelectTest() {
	//=============case1===================
	cz := make(chan int)
	rand.Seed(time.Now().Unix())
	go func() {
		time.Sleep(time.Second * time.Duration(rand.Intn(10)))
		cz <- 1 //随机时间往管道里写入值
	}()
	go func() {
		time.Sleep(time.Second * time.Duration(rand.Intn(10)))
		cz <- 2 
	}()
	select {
	case num := <-cz:
		if num == 1 {
			fmt.Println("case1:", num)
		} else {
			//其他业务逻辑
			fmt.Println("case1:", num)
		}
	case <-time.Tick(time.Second * 5): //设置超时
		fmt.Println("timeout")
		//当需要阻塞等待时,可以不写default语句,但必须要设置超时时间,以防止信道里始终没有接收到数据而发生超时
		//default:
		//	fmt.Println("default")
	}

	//=============case2===================
	c1 := make(chan string, 1)
	c2 := make(chan string, 1)
	go func() {
		time.Sleep(time.Second * 1)
		c1 <- "c1"
	}()
	go func() {
		time.Sleep(time.Second * 2)
		c2 <- "c2"
	}()
	select {
	case msg1 := <-c1: //每个case执行具有随机性
		fmt.Println(msg1)
	case msg2 := <-c2:
		fmt.Println(msg2)
		//default:
		//	fmt.Println("no data!")
	}

	//=============case3===================
	c := time.Tick(5 * time.Second)
	now := time.Now()
	end := now.Add(time.Hour)
	isRun := true
	rand.Seed(time.Now().Unix())
	for now.Before(end) && isRun {
		select {
		case <-c:
			isRun = rand.Intn(100) > 50
		}
		now = time.Now()
	}
	fmt.Println("end")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值