Каким образом можно определить, кто инициировал отмену текущего контекста?

В Go определить, кто инициировал отмену текущего контекста, напрямую нельзя, так как контекст не хранит информацию об инициаторе отмены.

Короткий ответ

Что ответить на собеседовании

В Go определить, кто инициировал отмену текущего контекста, напрямую нельзя, так как контекст не хранит информацию об инициаторе отмены.

Подробный разбор

Ответ с пояснениями

В Go определить, кто инициировал отмену текущего контекста, напрямую нельзя, так как контекст не хранит информацию об инициаторе отмены.

Однако можно:

  • Использовать разные контексты с разными источниками отмены (например, context.WithCancel, context.WithTimeout, context.WithDeadline), чтобы понимать причину отмены по типу контекста.
  • Передавать дополнительную информацию через контекст с помощью context.WithValue, чтобы идентифицировать инициатора.

Пример проверки причины отмены:

select {
case <-ctx.Done():
    err := ctx.Err()
    if err == context.Canceled {
        fmt.Println("Отмена вручную")
    } else if err == context.DeadlineExceeded {
        fmt.Println("Истекло время ожидания")
    }
}

Для точного определения инициатора отмены нужно реализовать собственный механизм передачи этой информации.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее