Что выведет код Middle context обновлено

Что выведет Go: поиск значений в цепочке контекстов

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import (
    "context"
    "fmt"
)

type key string

func main() {
    ctx := context.WithValue(context.Background(), key("user"), "anna")
    ctx2 := context.WithValue(ctx, key("user"), "boris")
    ctx3 := context.WithValue(ctx2, key("role"), "admin")
    fmt.Println(ctx3.Value(key("user")), ctx.Value(key("user")))
    fmt.Println(ctx3.Value("user"), ctx.Value(key("role")))
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: boris anna, <nil> <nil>. Value ищет ключ вверх по цепочке от текущего узла, поэтому ближайшее значение "boris" затеняет "anna".

Что выведет

boris anna
<nil> <nil>

Разбор

Value ищет ключ вверх по цепочке от текущего узла, поэтому ближайшее значение "boris" затеняет "anna". Родитель не видит значения потомков. Ключ "user" типа string не равен key("user"): интерфейсы с разными типами не равны. Поэтому ключи делают своим типом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.