Назад к вопросам
Yadro
Middle+
3
Почему нельзя закрыть канал, возвращаемый ctx.Done(), через функцию close()?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Канал, возвращаемый ctx.Done() в Go, нельзя закрывать вручную через close(), потому что этот канал управляется самим контекстом.
Причины:
- Канал
Done()создаётся и закрывается внутри реализации контекста, чтобы сигнализировать об отмене операции. - Если пользователь попытается закрыть этот канал самостоятельно, это приведёт к панике (panic), так как канал может быть уже закрыт или закрыт в другом месте.
- Контекст гарантирует, что канал будет закрыт ровно один раз, когда отмена произойдёт.
Правильный способ работы с ctx.Done() — только читать из канала, чтобы реагировать на отмену, но не пытаться его закрывать.
Пример использования:
ctx, cancel := context.WithCancel(context.Background())
// Запускаем горутину, которая слушает отмену
go func() {
<-ctx.Done() // ждем сигнал отмены
fmt.Println("Context cancelled")
}()
// Отмена контекста
cancel()
Таким образом, управление жизненным циклом канала Done() полностью на стороне контекста, и вмешательство пользователя запрещено.