Что такое контекст в Go и для чего он используется
golangконтекстосновы языкаразработка на Goуправление потоками
Что проверяют
Понимаете ли вы, что контекст это способ передать отмену и срок вниз по цепочке вызовов, и знаете ли правила его использования.
Как отвечать
context.Context решает одну задачу: сообщить всем участникам операции, что дальше работать не нужно. Клиент отключился, истёк таймаут, отменили родительскую задачу.
Как создают:
context.Background(): корневой, вmainи в тестах;WithCancel: отмена вручную;WithTimeoutиWithDeadline: отмена по времени;WithValue: положить значение, обычно идентификатор запроса для сквозного логирования.
Как слушают: канал ctx.Done() закрывается при отмене, ctx.Err() говорит причину.
select {
case <-ctx.Done():
return ctx.Err()
case res := <-ch:
return res
}Правила, которые проверяют:
- контекст передают первым параметром, не хранят в структуре;
- функция, вернувшая
cancel, обязана вызвать его, обычно черезdefer, иначе течёт таймер и горутина; - отмена распространяется вниз по дереву: отменили родителя, отменились все потомки;
WithValueтолько для данных, связанных со всем запросом, а не для передачи обычных аргументов.
Где спотыкаются
Не вызывают cancel и получают утечку.
Кладут в контекст зависимости и параметры функции.
Игнорируют ctx в длинных операциях, из-за чего отмена ни на что не влияет.
Передают context.TODO() в проде, не заменив его настоящим.