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)
        }
    }
}