如何判断channel已关闭?

本文阅读 1 分钟
首页 golang 正文

题目来源:小米

频次:高频

整理人:lws

方式1:通过读chennel实现

用 select 和 <-ch 来结合判断,ok的结果和含义:
true:读到数据,并且通道没有关闭。
false:通道关闭,无数据读到。

需要注意:
1.case 的代码必须是 _, ok:= <- ch 的形式,如果仅仅是 <- ch 来判断,是错的逻辑,因为主要通过 ok的值来判断;
2.select 必须要有 default 分支,否则会阻塞函数,我们要保证一定能正常返回;

ch := make(chan int, 10)
    go func() {
        for i:=1;i<10;i++{
            ch <- i
        }
    }()
    time.Sleep(1*time.Second)
    close(ch)
    for i:=0;i<10;i++{
        select {
        case v, ok := <- ch:
            if ok {
                fmt.Println(v)
            }else{
                fmt.Println("关掉了")
            }
        default:
            fmt.Println("没啥事")
    }
}

方式2:通过context

通过一个 ctx 变量来指明 close 事件,而不是直接去判断 channel 的一个状态.
当ctx.Done()中有值时,则判断channel已经退出。

注意:
select 的 case 一定要先判断 ctx.Done() 事件,否则很有可能先执行了 chan 的操作从而导致 panic 问题;

select {
case <-ctx.Done():
    // ... exit
    return
case v, ok := <-c:
    // do something....
default:
    // do default ....
}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
syncpool的实现原理
« 上一篇 09-17
问了sync.Map(我说我对sync.Pool比较熟,就说Pool了)
下一篇 » 09-17

发表评论

发表评论