Перейти к содержимому
4 / 15

Context: отмена, дедлайн, значения и как его правильно прокидывать

context.Context — стандартный способ передать вниз по стеку вызовов сигнал отмены, дедлайн и небольшой набор значений, привязанных к запросу. Устроен он как дерево: производный контекст отменяется вместе с родителем, но не наоборот. Соглашения жёсткие и проверяются линтерами: контекст передают первым аргументом с именем ctx, не хранят в структурах и не передают nil — для «пока никакого» есть context.Background() и context.TODO(). Функция WithCancel, WithTimeout и WithDeadline возвращают вторым значением cancel, и его обязательно вызывают через defer, иначе производный контекст и его таймер останутся жить до срабатывания родителя. Отмена не прерывает работу сама — она лишь закрывает канал ctx.Done(), а реагировать обязан код. Значения через WithValue предназначены для сквозных данных запроса вроде идентификатора трассировки, а не для передачи параметров, и ключ должен быть собственного неэкспортируемого типа.