1. 超时判断
package main import ( "fmt" "time" ) var resChan = make(chan int) //无缓冲区,只收或发将阻塞 func test() { select { case data := <-resChan: //如果resChan接收到数据,执行这条case doData(data) case <-time.After(time.Second * 3): //如果resChan 3s 没有数据返回,执行这条case fmt.Println("request time out") } } func doData(data int) {} func main() { test() }
GO
  1. 退出
package main var shouldQuit = make(chan struct{}) // 主线程 func main() { { //loop goroutine() } //out of the loop select { case <-shouldQuit: return default: } } // 在这个协程中,如果遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行 func goroutine() { //... // code //... var err error if err != nil { shouldQuit <- struct{}{} } close(shouldQuit) }
GO
  1. 判断channel是否阻塞
//如果我们不希望channel缓存满了,就可以用如下方法判断
ch:=make(chan int,5)
data:=0
select{
case ch<-data:
    default:
        //这一步视需求做相应操作,比如丢弃data
}
GO