Ответ
Poisoning в Go — это ситуация, когда горутина блокируется навсегда из-за ошибки в коде, например, при работе с каналами.
Пример:
func worker(ch chan int) {
for {
select {
case v := <-ch:
fmt.Println(v)
// Нет default, и если канал закрыт, горутина зависнет
}
}
}
Как избежать:
- Всегда проверяйте, открыт ли канал:
v, ok := <-ch
if !ok { return }
- Используйте
contextдля отмены. - Добавляйте
defaultвselect, если нужно неблокирующее поведение.
Poisoning может привести к утечкам памяти и зависанию программы.