应用场景举例:
一个任务管道满了,再往里面塞就塞不进去了,浏览器刷不出来了。用户即便关了浏览器可能依然在阻塞......

packagemainimport"fmt"import"time"funcmain(){varchchanintch=make(chanint,10)ch3:=make(chanint,10)gofunc(){variintfor{ch<-itime.Sleep(time.Second)ch3<-i*itime.Sleep(time.Second)i++}}()for{select{//这个case如果不能从ch中获取数据,则会立即走下一个casev:=<-ch:fmt.Println(v)//这个case如果不能从ch3中获取数据,则会立即走下一个casev:=<-ch3:fmt.Println(v)//然而这样写可能有内存泄漏!case<-time.After(time.Second):fmt.Println("getdatatimeout")time.Sleep(time.Second)default:fmt.Println("===================")time.Sleep(time.Second)}}}

上面的写法可能会有内存泄漏!

packagemainimport("fmt""runtime""time")funcmain(){num:=runtime.NumCPU()runtime.GOMAXPROCS(num-1)fori:=0;i<16;i++{gofunc(){for{//每秒执行一次t:=time.NewTicker(time.Second)select{case<-t.C:fmt.Println("timeout")}//一定要关闭t.Stop()}}()}time.Sleep(time.Second*100)}

go官方文档的建议: