Корень и заглушка контекста в Go
Корневой контекст не привязан к сроку
и не закрывает канал отмены. Его обычно
кладут в main или в верхнюю
команду сервиса и передают в функции,
которые сами построят дочерние контексты
с отменой или сроком.
Заглушку ставят там же, где позже появится настоящий родитель: код уже компилируется, а источник контекста еще не решен. Поведение у заглушки такое же, как у корня, она тоже не отменяется сама.
Обе команды возвращают готовое значение типа интерфейса контекста; проверим, что они не пустые:
package main
import (
"context"
"fmt"
)
func main() {
root := context.Background()
placeholder := context.TODO()
fmt.Println(root != nil, placeholder != nil)
}
На экране два раза true. Ни у
корня, ни у заглушки нет смысла вызывать
функцию отмены: отменять нечего.
В библиотечной функции, где родитель пока неизвестен, временно передают заглушку; когда вызов сверху дорастет, ее заменят на переданный контекст:
package main
import (
"context"
"fmt"
)
func report(ctx context.Context) {
fmt.Println(ctx != nil)
}
func main() {
report(context.TODO())
report(context.Background())
}
Дан следующий код:
var ctx context.Context
Присвойте ctx корневой контекст
и выведите, что он не равен nil.
Скажите, чем корень отличается от контекста с ручной отменой, которую разберем в следующем уроке.
Скажите, когда уместнее заглушка,
а когда сразу корень в main.