select典型用法
|
字数总计:
970
|
阅读时长:
1分钟
|
阅读量:
364
这篇文章距离最后更新已过45 天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
- 超时判断
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()
}
- 退出
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)
}
- 判断channel是否阻塞
//如果我们不希望channel缓存满了,就可以用如下方法判断
ch:=make(chan int,5)
data:=0
select{
case ch<-data:
default:
//这一步视需求做相应操作,比如丢弃data
}