A context can carry request metadata into a goroutine without using shared global state.

Context Worker Value

context_worker_value.go
package main

import (
	"context"
	"fmt"
)

func main() {
	var requestID = 
	ctx := context.WithValue(context.Background(), "request", requestID)
	done := make(chan string, 1)

	go func(workerContext context.Context) {
		value := workerContext.Value("request").(string)
		done <- "handled:" + value
	}(ctx)

	message := <-done

	fmt.Println("requestID=", requestID)
	fmt.Println("message=", message)
	fmt.Println("done=", true)
}
package main

import (
	"context"
	"fmt"
)

func main() {
	var requestID = 
	ctx := context.WithValue(context.Background(), "request", requestID)
	done := make(chan string, 1)

	go func(workerContext context.Context) {
		value := workerContext.Value("request").(string)
		done <- "handled:" + value
	}(ctx)

	message := <-done

	fmt.Println("requestID=", requestID)
	fmt.Println("message=", message)
	fmt.Println("done=", true)
}
package main

import (
	"context"
	"fmt"
)

func main() {
	var requestID = 
	ctx := context.WithValue(context.Background(), "request", requestID)
	done := make(chan string, 1)

	go func(workerContext context.Context) {
		value := workerContext.Value("request").(string)
		done <- "handled:" + value
	}(ctx)

	message := <-done

	fmt.Println("requestID=", requestID)
	fmt.Println("message=", message)
	fmt.Println("done=", true)
}
context value Pass a context into a worker goroutine and send the derived label back through a channel.