Метод context.Context.Value

Метод Value интерфейса context.Context позволяет извлечь значение, сохраненное в контексте по указанному ключу. Он принимает один параметр — ключ типа any (пустой интерфейс), а возвращает значение типа any, либо nil, если ключ не найден. Метод выполняет поиск по всей цепочке родительских контекстов, начиная с текущего.

Синтаксис

goval := ctx.Value(key)

Пример

Давайте создадим контекст с помощью функции context.WithValue и извлечем значение по ключу:

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  type keyType string
  const userKey keyType = "user"

  ctx := context.WithValue(context.Background(), userKey, "JohnDoe")
  res := ctx.Value(userKey)

  fmt.Println(res)
}

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

go"JohnDoe"

Пример

Если ключ отсутствует в контексте, метод возвращает nil:

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  type keyType string
  const userKey keyType = "user"

  ctx := context.Background()
  res := ctx.Value(userKey)

  fmt.Println(res)
}

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

go<nil>

Пример

Метод работает с цепочкой контекстов, проверяя каждого родителя:

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  type keyType string
  const requestKey keyType = "requestID"

  parent := context.WithValue(context.Background(), requestKey, "12345")
  child := context.WithValue(parent, "extra", "value")

  res := child.Value(requestKey)
  fmt.Println(res)
}

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

go"12345"

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

  • интерфейс context.Context,
    предоставляющий методы для работы с контекстом
  • функцию context.WithValue,
    которая создает контекст с новым значением
  • функцию context.Background,
    которая возвращает пустой корневой контекст
  • метод context.Context.Done,
    который возвращает канал для отслеживания отмены контекста