Практика на контекст в Go
Дан следующий код:
root := context.Background()
Получите от root контекст с
ручной отменой, повесьте функцию отмены
на defer и выведите, что канал
Done еще не закрыт, пока отмену
не вызывали.
Дан следующий код:
parent := context.Background()
go func(ctx context.Context) {
<-ctx.Done()
fmt.Println("off")
}(parent)
Замените аргумент ветки на контекст
с ручной отменой от parent,
вызовите отмену из main и
дождитесь печати "off".
Дан следующий код:
base := context.Background()
Постройте контекст со сроком сто
миллисекунд от base, дождитесь
Done и выведите "time up".
Дан следующий код:
for i := 0; i < 1000; i++ {
select {
default:
}
}
Оберните цикл в ветку с контекстом
со сроком десять миллисекунд от корня;
на каждой итерации выходите, если
Done уже закрыт, и напечатайте
"left loop".
Дан следующий код:
type roleKey struct{}
ctx := context.Background()
Запишите в ctx роль "guest"
и передайте контекст в функцию, которая
печатает значение по roleKey.
Дан следующий код:
type idKey struct{}
outer := context.WithValue(
context.Background(),
idKey{},
1,
)
inner, stop := context.WithCancel(outer)
defer stop()
Выведите число из inner по
idKey, затем вызовите stop
и скажите, останется ли значение
доступным после отмены.