РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1372 of 1593 menu

Тип context.CancelCauseFunc

Тип context.CancelCauseFunc представляет собой функцию, которая отменяет контекст и позволяет указать причину отмены. Этот тип является расширением обычной context.CancelFunc и возвращается функциями context.WithCancelCause, context.WithTimeoutCause и context.WithDeadlineCause. При вызове этой функции контекст отменяется, а переданная ошибка становится доступной через функцию context.Cause.

Синтаксис

type CancelCauseFunc func(cause error)

Тип CancelCauseFunc определяет функцию, которая принимает один параметр - ошибку cause, описывающую причину отмены. Эта функция не возвращает никаких значений.

Пример с WithCancelCause

Давайте создадим контекст с возможностью отмены по причине и отменим его с указанием конкретной ошибки:

package main import ( "context" "fmt" "errors" ) func main() { ctx, cancel := context.WithCancelCause(context.Background()) // Отменяем контекст с указанием причины cancel(errors.New("operation cancelled by user")) // Проверяем причину отмены cause := context.Cause(ctx) fmt.Println(cause) }

Результат выполнения кода:

"operation cancelled by user"

Пример с WithTimeoutCause

Рассмотрим пример использования CancelCauseFunc с таймаутом, где причиной отмены становится превышение времени:

package main import ( "context" "fmt" "errors" "time" ) func main() { ctx, cancel := context.WithTimeoutCause( context.Background(), 10*time.Millisecond, errors.New("timeout exceeded"), ) defer cancel() time.Sleep(20 * time.Millisecond) // Проверяем причину отмены cause := context.Cause(ctx) fmt.Println(cause) }

Результат выполнения кода:

"timeout exceeded"

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

Покажем, как можно проверить причину отмены с помощью функции context.Cause:

package main import ( "context" "fmt" "errors" ) func main() { ctx, cancel := context.WithCancelCause(context.Background()) // Создаем две возможные причины errUserCancel := errors.New("user cancelled") errTimeout := errors.New("timeout reached") // Отменяем с одной из причин cancel(errUserCancel) // Проверяем причину cause := context.Cause(ctx) if cause == errUserCancel { fmt.Println("cancelled by user") } else if cause == errTimeout { fmt.Println("cancelled by timeout") } else { fmt.Println("cancelled by other reason") } }

Результат выполнения кода:

"cancelled by user"

Смотрите также

  • функцию context.WithCancelCause,
    которая создает контекст с возможностью отмены по причине
  • функцию context.Cause,
    которая возвращает причину отмены контекста
  • тип context.CancelFunc,
    который представляет базовую функцию отмены без указания причины
  • функцию context.WithTimeoutCause,
    которая создает контекст с таймаутом и причиной отмены
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить