8 вопросов
context.Context - механизм для передачи дедлайнов, сигналов отмены и request-scoped данных. Всегда передаётся первым аргументом функции по конвенции Go.
Конвенция Go: ctx context.Context - всегда первый аргумент функции. Не храните context в структурах. Создавайте для каждого запроса/операции.
Подробнее →Контексты образуют дерево. Отмена родительского контекста каскадно отменяет все дочерние - прямые и вложенные. Обратное неверно: отмена дочернего контекста не влияет на родительский. Это позволяет отменять целые поддеревья запросов.
Подробнее →Отмена context каскадно отменяет все дочерние context'ы через ctx.Done(). Это ключевой механизм graceful shutdown: отменили корневой - все горутины получают сигнал. Дочерний может быть отменён раньше родительского (WithTimeout).
Подробнее →context.Context? 🟡 Средний
▶
context.Context - механизм для передачи сигналов отмены, дедлайнов и request-scoped данных через цепочку вызовов. Позволяет корректно завершать работу при отмене.
Подробнее →context.WithCancel(parent)? 🟡 Средний
▶
Возвращает (ctx, cancel). Вызов cancel() отменяет ctx и всех его потомков. Родительский parent не затрагивается. Всегда вызывайте cancel() через defer для освобождения ресурсов.
Подробнее →context.WithTimeout(ctx, 5*time.Second)? 🟡 Средний
▶
WithTimeout - обёртка над WithDeadline. Контекст автоматически отменяется по истечении таймаута ИЛИ при вызове cancel(). Канал ctx.Done() закрывается при отмене.
Подробнее →context.WithValue? 🔴 Сложный
▶
Неэкспортируемый тип (type ctxKey struct{}) предотвращает коллизии ключей между пакетами. Строковые ключи могут совпасть случайно. Каждый пакет определяет свой приватный тип ключа для изоляции значений в контексте.
Подробнее →context.AfterFunc(ctx, f) (Go 1.21+)? 🔴 Сложный
▶
context.AfterFunc регистрирует функцию f, которая будет вызвана в отдельной горутине после отмены контекста ctx. Возвращает функцию stop для отмены регистрации. Полезно для cleanup-логики, привязанной к жизненному циклу контекста.
Подробнее →