课程名称:GO开发工程师
课程章节:6-4:Select
课程讲师: ccmouse
课程内容:
- 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")
}
}
- 定时器的使用、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
}
}
}
课程收获:
- channel 输入、输出数据都是阻塞式的。
- nil channel 在select中不会报错
- select default组合模拟非阻塞式调用