Ответ
Контекст в Go передаётся по значению, но содержит ссылку на общие данные. Если изменить контекст на одном уровне (например, добавить значение через context.WithValue), это не затронет оригинальный контекст, но создаст новый производный контекст. На разных уровнях цепочки каждый будет видеть только свои и родительские значения.
ctx := context.Background()
ctx1 := context.WithValue(ctx, "key", "value1") // новый контекст
ctx2 := context.WithValue(ctx, "key", "value2") // другой новый контекст
fmt.Println(ctx1.Value("key")) // "value1"
fmt.Println(ctx2.Value("key")) // "value2"
Важно: контексты иммутабельны, изменения не затрагивают родительские контексты.