A context can carry request-scoped values through function calls.

context value Context values are best for small request data that needs to travel with the context.

Context Values

user
context_values.go
Replay: real traced execution (multi-file project)
package main

import (
	"context"
	"fmt"
)

type contextKey string

func main() {
	var user = "Ava"
	key := contextKey("user")
	ctx := context.WithValue(context.Background(), key, user)

	value := ctx.Value(key)
	fmt.Println("user=", value)
	fmt.Println("known=", value != nil)
}
package main

import (
	"context"
	"fmt"
)

type contextKey string

func main() {
	var user = "Mina"
	key := contextKey("user")
	ctx := context.WithValue(context.Background(), key, user)

	value := ctx.Value(key)
	fmt.Println("user=", value)
	fmt.Println("known=", value != nil)
}
package main

import (
	"context"
	"fmt"
)

type contextKey string

func main() {
	var user = "Theo"
	key := contextKey("user")
	ctx := context.WithValue(context.Background(), key, user)

	value := ctx.Value(key)
	fmt.Println("user=", value)
	fmt.Println("known=", value != nil)
}
  1. user ← "Ava", key ← "user", ctx ← &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Ava"}

    10func main() {11  var user→ "Ava" = "Ava" //@user="Mina", "Theo"12  key→ "user" := contextKey("user")13  ctx→ &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Ava"} := context.WithValue(context.Background(), key"user", user"Ava")1415  value→ "Ava" := ctx&context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Ava"}.Value(key"user")16  fmt.Println("user=", value"Ava")17  fmt.Println("known=", value"Ava" != nil)18}
    outputuser= Ava
    known= true
  1. user ← "Mina", key ← "user", ctx ← &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Mina"}

    10func main() {11  var user→ "Mina" = "Mina"12  key→ "user" := contextKey("user")13  ctx→ &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Mina"} := context.WithValue(context.Background(), key"user", user"Mina")1415  value→ "Mina" := ctx&context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Mina"}.Value(key"user")16  fmt.Println("user=", value"Mina")17  fmt.Println("known=", value"Mina" != nil)18}
    outputuser= Mina
    known= true
  1. user ← "Theo", key ← "user", ctx ← &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Theo"}

    10func main() {11  var user→ "Theo" = "Theo"12  key→ "user" := contextKey("user")13  ctx→ &context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Theo"} := context.WithValue(context.Background(), key"user", user"Theo")1415  value→ "Theo" := ctx&context.valueCtx{Context:context.backgroundCtx{emptyCtx:context.emptyCtx{}}, key:"user", val:"Theo"}.Value(key"user")16  fmt.Println("user=", value"Theo")17  fmt.Println("known=", value"Theo" != nil)18}
    outputuser= Theo
    known= true