只有当 chan 关闭的时候,for 循环才会结束
当使用 for range 循环缓冲区的时候, 当缓冲区中没有 数据时 也是不会结束的
chan开销很小,不需要像文件一样,经常关闭,只有不需要使用时才需要关闭
Select 使用
只有当 chan1 chan2 有被准备好的 通道才可以执行,否则的话就陷入阻塞
如果有多个channel 准备好了 ,那就随机选一个分支进行执行
for{ Select { Case chan1 <-x: - x,y=y,x+y Case <- chan2 : - fmt.Println("quit") - return } }
缓冲区过多时的等待方法
var waitgroup sync.WaitGroup For i :=0 ; i<10 ;i++{ waitgroup.add(1) go func(){ - fmt.Println("hellow world") - waitgroup.Done() }() waitgroup.Wait() }
通过select 来监听超时
func listen_time_out() { chan1 := make(chan int, 1) listen_time_out := make(chan bool) go func() { for { select { case v := <-chan1: println(v) case chan1 <- 2: // chan1 <- 2 case <-time.After(5 * time.Second): listen_time_out <- true return // break } } }() <-listen_time_out } func main() { listen_time_out() }
定时退出程序
go func() { select { case <-time.After(3 * time.Second): listen_time_out <- true // os.Exit(0) } }() <- listen_time_out