Ответ
В Go можно определить, кто отменил контекст (context.Context), используя метод context.Cause(). Этот метод возвращает причину отмены контекста, если она была задана через context.WithCancelCause(). Если контекст был отменен без указания причины (например, через context.WithCancel()), Cause() вернет context.Canceled.
Пример:
ctx, cancel := context.WithCancelCause(context.Background())
cancel(fmt.Errorf("пользовательская ошибка"))
if err := context.Cause(ctx); err != nil {
fmt.Println("Причина отмены:", err) // Выведет: Причина отмены: пользовательская ошибка
}
Если контекст отменен по таймауту или дедлайну, Cause() вернет context.DeadlineExceeded.