只有当 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