👁 Когда вы работаете с внешними API, важно эффективно управлять временем ожидания и отменой запросов, чтобы избежать зависания и утечек ресурсов. В Go для этого идеально подходит пакет context. С помощью контекста можно задавать тайм-ауты и отменять запросы, если они не выполняются вовремя, что особенно важно для микросервисных архитектур.
📝 Пример кода с использованием контекста для работы с API:
package main
import (
"context"
"fmt"
"net/http"
"time"
)
func fetchData(ctx context.Context, url string) (string, error) {
req, _ := http.NewRequest("GET", url, nil)
req = req.WithContext(ctx)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil { return "", err }
defer resp.Body.Close()
return resp.Status, nil
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
fmt.Println(fetchData(ctx, "https://jsonplaceholder.typicode.com/todos/1"))
}
📌 Как это работает:
- Создаём контекст с таймаутом: с помощью context.WithTimeout устанавливаем максимальное время ожидания для запроса.
- Передаем контекст в запрос: запрос получает контекст, что позволяет отслеживать его выполнение и отменить, если он превысил лимит времени.
- Ожидаем результат или ошибку: запрос к API выполняется как обычно, но с контролем времени через контекст.
- Если таймаут истекает, контекст отменяет запрос: при превышении времени ожидания контекст автоматически завершает запрос и возвращает ошибку.
❗️ Это полезно в проектах, где важна высокая устойчивость и минимизация зависаний от внешних сервисов, особенно при работе с множеством API-запросов в микросервисной архитектуре.
tags: #go #разработка #api



