41

golang channel的关闭问题

 5 years ago
source link: https://studygolang.com/articles/19188?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

golang channel的关闭问题

碰到一个问题,如何判断一个channel是否已经关闭了。

答案是:没有办法

下面有一些特例用来处理channel的关闭问题。

  1. 如果确定不会向channel写入信息

下面函数可以判断一个channel是否已经关闭。

func IsClosed(ch <-chan interface{}) bool {
    select {
    case <-ch:
        return true
    default:
    }
    
    return false
}

因为如果channel没有关闭,<-ch将不会返回,直到chanel已经被关闭。

另外,<-chan可以带两个参数:

x, ok := <-ch
if !ok {
    // closed
}
  1. 处理关闭一个已经关闭的channel
func MyClose(ch chan interface{}) {
    defer func() {
        if recover() != nil {
            // close(ch) panic occur
        }
    }()
    
    close(ch) // panic if ch is closed
}

如果channel已经close了,那么再调用close时就会panic;在这个函数中:

  1. 如果close(ch)没有panic,那么正常关闭。
  2. 如果close(ch)发生panic,说明它已经被关闭了,那么此时截获panic,丢弃这个panic。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK