有一个代码:
func (c *Connector) SendPacketFuture(p []byte) (future chan []byte) {
defer func() {
// TODO Check r to catch only chan panics
if r := recover(); r != nil {
future = nil
}
}()
t := newConnectorTask(p)
c.tasks <- t
future = t.PacketFromServerChan
return
}
TODO
非常明显。
c.tasks
是一个频道,它可以被另一个goroutine关闭。由于没有安全的方式发送到可以关闭的频道,我在这里捕捉恐慌。问题在于可能会发生不同的恐慌,并且我想通过写入已关闭的陈来对所引发的恐慌作出反应。
是否可以在Go中执行此操作?
答案 0 :(得分:1)
在这种情况下,恢复消息是运行时的未导出错误值,字符串值为"send on closed channel"
。
这里唯一能做的就是匹配错误字符串:
if e, ok := r.(error); ok && w.Error() == "send on closed channel" {
fmt.Println("recover from send on closed channel")
}
https://play.golang.org/p/LNcfdE9Bg2
实际上,您可能需要的是一个单独的通道,用于指示何时退出。
t := newConnectorTask(p)
select {
case <-c.close:
// closing the c.close channel will unblock this case
return
case c.tasks <- t:
}