Производные contexts
Пакет context предоставляет функции для получения новых значений Context из существующих. Эти значения образуют дерево: при отмене Context все его Contexts также отменяются.
Background - это корень любого дерева Context; он никогда не отменяется:
// Background возвращает пустой Context. Он никогда не отменяется,
// не имеет времени окончания существования и не имеет значений.
// Background обычно используется в main, init и tests,
// а также в качестве Context верхнего уровня для входящих запросов.
func Background() Context
WithCancel и WithTimeout возвращают производные значения Context, которые могут быть отменены раньше родительского Context. Context, связанный с входящим запросом, обычно отменяется при возвращении обработчика запросов. WithCancel также полезен для отмены избыточных запросов при использовании нескольких реплик. WithTimeout полезен для установки времени окончания существования запросов на backend серверы:
// WithCancel возвращает копию родителя, чей канал закрылся,
// как только parent.Done закрылся или был вызван метод cancel.
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
// CancelFunc отменяет Context.
type CancelFunc func()
// WithTimeout возвращает копию родителя, чей Done канал закрыт,
// как только parent.Done закрылся, был вызываан метод cancel,
// или истекло время ожидания. Крайним сроком для нового Context
// является now+timeout и deadline родителя, если таковой имеется.
// Если таймер все еще работает, функция Cancel освобождает свои ресурсы.
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
WithValue предоставляет способ связать значения области запроса с Context:
// WithValue возвращает копию родителя, чей метод Value возвращает значение val для key.
func WithValue(parent Context, key interface{}, val interface{}) Context
Лучший способоб узнать, как использовать пакет context, - посмотреть на рабочий пример.