Там есть код:Голанг. Получить панического типа
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
- это канал, и он может быть закрыт другой горутой. Поскольку нет безопасного способа отправить канал, который можно закрыть, я поймаю панику здесь. Проблема в том, что возможны разные паники и Я хочу реагировать на тот, который поднят путем записи в закрытый chan.
Можно ли это сделать в Go?
В общем, вы не должны пытаться обнаружить это, и есть другой способ архитектовать программу. Есть причина, что это паника, предназначенная для краха программы. – JimB
Он построен вокруг кэша TTL. Есть редкое состояние гонки, когда мы пытаемся создать будущее на коннекторе, который только что истек и был удален из кеша. Я могу добавить SharedMutex для синхронизации вещей, но это только добавит постоянные затраты времени исполнения при решении _potential_ RC. Работа с паникой кажется разумным взломом для меня –
Но почему канал закрыт? Закрытие - это сигнал, который посылает отправитель (обычно), следовательно, паника, когда канал закрыт. – JimB