Функция context.WithTimeoutCause

Функция context.WithTimeoutCause создает новый контекст, который автоматически отменяется по истечении указанного таймаута. В отличие от context.WithTimeout, эта функция позволяет задать пользовательскую ошибку, которая будет возвращена функцией context.Cause при отмене контекста по таймауту. Первый параметр функции - родительский контекст, второй - продолжительность таймаута, третий - ошибка-причина. Функция возвращает новый контекст и функцию отмены.

Синтаксис

gocontext.WithTimeoutCause(ctx, timeout, cause)

Пример

Давайте создадим контекст с таймаутом 1 секунду и причиной "timeout occurred":

gopackage main

import (
  "context"
  "fmt"
  "time"
)

func main() {
  ctx, cancel := context.WithTimeoutCause(
    context.Background(),
    time.Second,
    fmt.Errorf("timeout occurred"),
  )
  defer cancel()

  select {
  case <-time.After(2 * time.Second):
    fmt.Println("operation completed")
  case <-ctx.Done():
    fmt.Println("error:", ctx.Err())
    fmt.Println("cause:", context.Cause(ctx))
  }
}

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

go"error: context deadline exceeded"
"cause: timeout occurred"

Пример

Давайте используем контекст с таймаутом в операции, которая выполняется быстрее таймаута:

gopackage main

import (
  "context"
  "fmt"
  "time"
)

func main() {
  ctx, cancel := context.WithTimeoutCause(
    context.Background(),
    time.Second,
    fmt.Errorf("operation timeout"),
  )
  defer cancel()

  select {
  case <-time.After(500 * time.Millisecond):
    fmt.Println("operation completed successfully")
  case <-ctx.Done():
    fmt.Println("error:", ctx.Err())
    fmt.Println("cause:", context.Cause(ctx))
  }
}

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

go"operation completed successfully"

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

  • функцию context.WithTimeout,
    которая создает контекст с таймаутом без указания причины
  • функцию context.WithDeadlineCause,
    которая создает контекст с дедлайном и причиной
  • функцию context.WithCancelCause,
    которая создает контекст с ручной отменой и причиной
  • функцию context.Cause,
    которая возвращает причину отмены контекста