为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第12天 go语言Select

标签:
Go

课程名称GO开发工程师

课程章节:6-4:Select

课程讲师ccmouse

课程内容

  1. select的基本用法示例:
func test1() {
	var c1, c2 chan int // 只声明,未赋值,都是 nil

	// select: 里面的case谁先收到就打印谁
	// chan里读写数据都是阻塞订单
	// 非阻塞: select + default组合
	select {
	case n := <-c1:
		fmt.Println("received value from c1: ", n)
	case n := <-c2:
		fmt.Println("received value from c2: ", n)
	default:
		// 因为c1 c2 都是nil,结果会打印这一行
		fmt.Println("no value received")
	}
}
  1. 定时器的使用、Nil chan的使用
func test2() {
	var c1, c2 = generator(), generator()
	worker := createWorker(0)

	// 避免生产堆积,用slice缓存
	var values []int
	
	// 定时器的使用
	tm := time.After(10 * time.Second) // 10s 后退出;返回chan
	tick := time.Tick(time.Second) // 定时器;返回chan
	
	for {
		var activeWorker chan int
		var activeValue int
		if len(values) > 0 {
			activeWorker = worker
			activeValue = values[0]
		}
		select {
		case n := <-c1:
			values = append(values, n)
		case n := <-c2:
			values = append(values, n)
		case activeWorker <- activeValue: // 在select中的nil chan 不会报错
			values = values[1:]
		case <-time.After(500 * time.Millisecond):
			fmt.Println("timeout")
		case <-tick:
			fmt.Println("queue len: ", len(values))
		case <-tm:
			fmt.Println("bye")
			return
		}
	}
}

课程收获

  1. channel 输入、输出数据都是阻塞式的。
  2. nil channel 在select中不会报错
  3. select default组合模拟非阻塞式调用

图片描述
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消