context.Context передает значения, сигнал отмены и дедлайн. context.Background() - корневой. WithCancel, WithTimeout, WithDeadline - производные контексты; при отмене родителя отменяются дочерние. WithValue - ключ и значение (осторожно с типами ключей). В HTTP handler передают r.Context(); при долгих операциях создают контекст с таймаутом. Проверка: ctx.Done(), ctx.Err().
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()
select {
case <-ctx.Done():
return ctx.Err()
case result := <-ch:
return result
}