Что отработает раньше, если одновременно отправить в канал сигнал отмены и записи

«Что отработает раньше, если одновременно отправить в канал сигнал отмены и записи» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При одновременной отправке в канал сигнала отмены (context.Context) и записи, порядок обработки не гарантирован - он зависит от планировщика Go. Однако есть важные нюансы:

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

На практике рекомендуется всегда проверять отмену контекста в первую очередь, чтобы избежать ненужной работы.