手记

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

课程名称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组合模拟非阻塞式调用


0人推荐
随时随地看视频
慕课网APP