Код IT
← Каталог

Рекомендации по разработке на Go — Обработка ошибок с контекстом

Фрагмент из «Рекомендации по разработке на Go»: Обработка ошибок с контекстом.

Go main.go
// LoadUserData загружает данные пользователя из внешнего сервиса.
// Возвращает ошибку с контекстом операции для упрощения отладки.
func LoadUserData(ctx context.Context, userID string) (*UserData, error) {
    req, err := http.NewRequestWithContext(ctx, "GET", apiURL, nil)
    if err != nil {
        return nil, fmt.Errorf("create request: %w", err)
    }

    req.Header.Set("X-User-ID", userID)

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, fmt.Errorf("execute request: %w", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("unexpected status %d", resp.StatusCode)
    }

    var Data UserData
    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        return nil, fmt.Errorf("decode response: %w", err)
    }

    return &data, nil
}
// LoadUserData загружает данные пользователя из внешнего сервиса.
// Возвращает ошибку с контекстом операции для упрощения отладки.
func LoadUserData(ctx context.Context, userID string) (*UserData, error) {
    req, err := http.NewRequestWithContext(ctx, "GET", apiURL, nil)
    if err != nil {
        return nil, fmt.Errorf("create request: %w", err)
    }

    req.Header.Set("X-User-ID", userID)

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, fmt.Errorf("execute request: %w", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("unexpected status %d", resp.StatusCode)
    }

    var Data UserData
    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        return nil, fmt.Errorf("decode response: %w", err)
    }

    return &data, nil
}