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()
}
  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)
}
  1. 判断channel是否阻塞
//如果我们不希望channel缓存满了,就可以用如下方法判断
ch:=make(chan int,5)
data:=0
select{
case ch<-data:
    default:
        //这一步视需求做相应操作,比如丢弃data
}