select
其实就是channel的round robin形式的负载均衡器。
做为接收者,随机且并发地接受到ch1-3中的数据。
如果配置了default,则default不论ch1-3中是否有数据,都有可能执行。
ch1
ch2
ch3
select
其实就是channel的round robin形式的负载均衡器。
做为发送者,随机且并发地发送数据到ch1-3中。
这里的default行为,和select做为接收者的时候,行为不同。
如果配置了default,则default分支,只有等待ch1-3的管道缓冲都满了,才有可能执行。
ch1
ch2
ch3
default用于非阻塞地执行。
与 context.done配合,实现goroutine的优雅退出。
func worker(done <-chan struct{}, tasks <-chan int) {
for {
select {
case <-done:
fmt.Println("Worker received done signal, exiting.")
return
case task := <-tasks:
fmt.Println("Processing task:", task)
}
}
}