Этот вопрос проверяет понимание концепции контекстов в Go, которые используются для управления временем выполнения, отмены и передачи данных между горутинами.
Контексты в Go — это механизм для управления жизненным циклом горутин. Они позволяют устанавливать дедлайны, отменять задачи и передавать данные между горутинами. Контексты создаются через функции пакета context и часто используются в сетевых запросах или долгоживущих процессах.
Контексты в Go реализуются с помощью пакета context. Главный интерфейс Context предоставляет четыре ключевых метода:
Deadline — возвращает дедлайн выполнения задачи, если он установлен.
Done — возвращает канал, который закрывается при отмене контекста.
Err — возвращает ошибку, если контекст завершён или отменён.
Value — позволяет хранить и извлекать данные, связанные с контекстом.
Создание контекста:
Базовый контекст: используется как отправная точка.
ctx := context.Background() // Контекст без данных и времени выполненияС отменой:
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(2 * time.Second)
cancel() // Отменяет контекст
}()
<-ctx.Done() // Ожидание завершения
fmt.Println("Контекст завершён:", ctx.Err())С дедлайном:
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Second))
defer cancel()
<-ctx.Done()
fmt.Println("Сработал дедлайн:", ctx.Err())В каких случаях использовать
Для управления временем выполнения HTTP-запросов.
В ситуациях, когда необходимо синхронно завершить связанные горутины.
Для передачи настроек или метаданных (например, идентификаторов запросов).