Функция context.WithValue
Функция context.WithValue возвращает новый контекст,
который содержит переданную пару ключ-значение.
Первый параметр — родительский контекст, от которого
наследуется новый. Второй параметр — ключ, по которому
будет храниться значение. Третий параметр — само значение,
которое нужно сохранить. Полученный контекст можно передавать
вниз по цепочке вызовов, а извлечь значение можно с помощью
метода Value.
Синтаксис
ctx := context.WithValue(parentCtx, key, value)
Пример
Создадим контекст с идентификатором запроса и извлечём его в дочерней функции:
package main
import (
"context"
"fmt"
)
func main() {
ctx := context.Background()
ctx = context.WithValue(ctx, "requestID", "req-12345")
processRequest(ctx)
}
func processRequest(ctx context.Context) {
val := ctx.Value("requestID")
fmt.Println(val)
}
Результат выполнения кода:
"req-12345"
Пример
Используем пользовательский тип в качестве ключа, чтобы избежать конфликтов:
package main
import (
"context"
"fmt"
)
type ctxKey string
func main() {
ctx := context.Background()
key := ctxKey("user")
ctx = context.WithValue(ctx, key, "Alice")
printUser(ctx, key)
}
func printUser(ctx context.Context, key ctxKey) {
val := ctx.Value(key)
fmt.Println(val)
}
Результат выполнения кода:
"Alice"
Пример
Контекст может хранить несколько значений, используя
вложенные вызовы WithValue:
package main
import (
"context"
"fmt"
)
func main() {
ctx := context.Background()
ctx = context.WithValue(ctx, "api-version", "v2")
ctx = context.WithValue(ctx, "timeout", "30s")
showConfig(ctx)
}
func showConfig(ctx context.Context) {
ver := ctx.Value("api-version")
tout := ctx.Value("timeout")
fmt.Println("version:", ver)
fmt.Println("timeout:", tout)
}
Результат выполнения кода:
"version: v2"
"timeout: 30s"
Смотрите также
-
функцию
context.Background,
которая возвращает пустой корневой контекст -
метод
Context.Value,
который извлекает значение из контекста по ключу -
функцию
context.WithCancel,
которая создаёт контекст с функцией отмены -
функцию
context.WithTimeout,
которая создаёт контекст с таймаутом