Проверяет понимание соглашения о передаче context.Context первым аргументом в функциях Go и его влияния на управление временем жизни операций.
Context в Go — это стандартный механизм для передачи сигналов отмены, дедлайнов и значений между горутинами и функциями. Он позволяет остановить долгие операции (например, HTTP-запросы, обращения к БД) при отмене родительского контекста, что критично для эффективного использования ресурсов.
Соглашение о передаче context первым аргументом делает сигнатуру функций единообразной. Это упрощает чтение кода: разработчик сразу видит, что функция зависит от контекста. Также это позволяет легко передавать context через цепочку вызовов без необходимости менять порядок аргументов. Стандартная библиотека (например, net/http) и большинство библиотек следуют этому правилу, поэтому соблюдение соглашения обеспечивает совместимость.
func FetchData(ctx context.Context, url string) ([]byte, error) {
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}
// Вызов с таймаутом
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
data, err := FetchData(ctx, "https://example.com")Здесь context передаётся первым аргументом, что позволяет ограничить время выполнения запроса. Если таймаут истечёт, запрос будет отменён автоматически.
Передача context первым аргументом — это не просто стиль, а важное соглашение, которое обеспечивает управляемость и предсказуемость асинхронных операций. Следуйте ему во всех функциях, которые могут быть отменены или ограничены по времени, чтобы ваш код был надёжным и легко поддерживаемым.