Ответ
При одновременной отправке в канал сигнала отмены (context.Context) и записи, порядок обработки не гарантирован - он зависит от планировщика Go. Однако есть важные нюансы:
- Если канал не буферизирован, обе операции будут блокироваться до готовности другой стороны
- При использовании
selectпорядок case'ов не влияет на выбор, он рандомизирован для fairness - Лучше явно обрабатывать отмену первым в select:
select {
case <-ctx.Done():
// обработка отмены
case data := <-ch:
// обработка данных
}
На практике рекомендуется всегда проверять отмену контекста в первую очередь, чтобы избежать ненужной работы.