package mainimport "fmt"func sender(out chan int, exit chan bool) { for i := 1; i <= 10; i++ { out <- i } exit <- true}func main() { out := make(chan int, 10) exit := make(chan bool) go sender(out, exit) for { select { case i := <-out: fmt.Printf("Value: %dn", i) continue default: } select { case i := <-out: fmt.Printf("Value: %dn", i) continue case <-exit: fmt.Println("Exiting") } break } fmt.Println("Did we get all 10? I think so!")}第一次选择的默认情况使其变为非阻塞。该选择将耗尽输出通道,而无需查看出口通道,否则将不等待。如果输出通道为空,则立即下降到第二选择。第二个选择是阻止。它将等待任一通道上的数据。如果有出口,它将对其进行处理并允许循环退出。如果有数据,它将返回循环的顶部并返回到耗尽模式。



