2015 подписчиков
Golang бросает панику при закрытии уже закрытого канала. Есть несколько способов, чтобы избежать такого рода паники.
Каждый вариант кода инкапсулирует struct и используется как интерфейс (картинка 1).
1) Panic
В примемер реализован интерфейс Signal:
(картинка 2)
Второй вызов Close() вызывает панику.
2) Простой select является потокобезопасным вариантом.
(картинка 3)
3) Панику можно перехватить с помощью функции recover() в defer
(картинка 4).
4) sync.Once - еще один способ перехвата. Он вызывает close() только один раз и это элегантный способ обработки закрытия нескольких каналов (картинка 5).
5)В Golang 1.21 появилась функция sync.OnceFunc, которая лучше подходит для этого случая использования (картинка 6).
Можно также использовать sync.Mutex, но он не является оптимальным, как sync.Once, поскольку всегда использует блокировку и разблокировку.
6) context.WithCancel - это еще один вариант, чтобы избежать панику (картинка 7).
Напишите свой вариант кода в комментариях👇
Около минуты
10 июля 2023