Функция context.WithTimeoutCause
Функция context.WithTimeoutCause создает новый контекст,
который автоматически отменяется по истечении указанного таймаута.
В отличие от context.WithTimeout, эта функция позволяет
задать пользовательскую ошибку, которая будет возвращена
функцией context.Cause при отмене контекста по таймауту.
Первый параметр функции - родительский контекст, второй -
продолжительность таймаута, третий - ошибка-причина.
Функция возвращает новый контекст и функцию отмены.
Синтаксис
context.WithTimeoutCause(ctx, timeout, cause)
Пример
Давайте создадим контекст с таймаутом 1 секунду и причиной "timeout occurred":
package 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))
}
}
Результат выполнения кода:
"error: context deadline exceeded"
"cause: timeout occurred"
Пример
Давайте используем контекст с таймаутом в операции, которая выполняется быстрее таймаута:
package 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))
}
}
Результат выполнения кода:
"operation completed successfully"
Смотрите также
-
функцию
context.WithTimeout,
которая создает контекст с таймаутом без указания причины -
функцию
context.WithDeadlineCause,
которая создает контекст с дедлайном и причиной -
функцию
context.WithCancelCause,
которая создает контекст с ручной отменой и причиной -
функцию
context.Cause,
которая возвращает причину отмены контекста