Context and Cancellation
Context Values
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
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)
}
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
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
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