Golang が最初の作業タスクをどのように解決するか

WBOY
リリース: 2024-07-17 21:50:35
オリジナル
523 人が閲覧しました

Golang、または単に Go は、Go gopher 言語として知られるようになりました。なぜホリネズミなのかまだ理解できない場合は、この記事で驚くべきマスコットの歴史を見つけることができます。さて、最初から始めましょう。Golang は、世の中で最も生産性の高いプログラミング言語の 1 つとして知られるようになりました。 Java や Python などの従来の言語とは異なり、Go は書きやすいコードと迅速な実行の間で独自のバランスをとっており、開発を高速化し、デバッグとテストの時間を短縮します。この記事では、遅くて不安定な REST API マイクロサービスと対話するプロジェクトでゴルーチンとコンテキストを使用する実際の例を見ていきます。

タスク
あなたがチームに加わったばかりで、チーム リーダーから、Golang で書かれた新しいマイクロサービス (リスク マネージャーなど) を、REST API を通じて公開されるユーザー マイクロサービスにバインドするように頼まれたとします。

問題
リスク マネージャーは、速度が遅く不安定な可能性がある REST API を操作する必要があるため、そのようなリクエストを慎重に処理する必要があります。非同期 HTTP リクエストとコンテキストにはゴルーチンを使用して、リクエストのタイムアウトとエラー処理を管理します。

解決策

Golang でゴルーチンとコンテキストを使用すると、同時タスクの効率的な管理と、低速または不安定な外部 API の処理が可能になります。

コードで解釈するための最初のステップは API を作成することです。私はシェアウェア サービスを使用しました https://mockapi.io/ REST を生成すると便利ですusers.

などのエンティティの基本セットを含む API

Image description

誰かが最善を尽くし、あなたの会社にはユーザーをリストする内部サービスがあるとします。私たちのタスクは、新しいリスク マネージャーでユーザー リストを再利用することです (ユーザー データ構造は mockapi.io で記述された契約を満たしています)。以下のコードはリクエストを作成し、本文を処理して、ユーザーのリストまたは対応するエラーを生成します。

type User struct {
    CreatedAt string
    Name      string
    Avatar    string
    Id        string
}

// Original slow request
func fetchUsers(ctx context.Context) (*[]User, error) {
    resp, err := http.Get("https://<use your id after sign up>.mockapi.io/api/v1/users")
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("failed to fetch users: %s", resp.Status)
    }

    var users []User
    if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
        return nil, err
    }

    return &users, nil
}
ログイン後にコピー

操作を制御するために、他のすべてのコンテキストの最上位の親コンテキストである context.Background を使用します。このコンテキストを新しいデータで補足します。この場合はタイムアウト - context.WithTimeout で、これを 2 秒として定義します。 Go でのコンテキストの操作について詳しくは、この記事をご覧ください。

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

usersChan := make(chan *[]User)
errChan := make(chan error)

go func() {
    users, err := fetchUsers(ctx)
    if err != nil {
        errChan <- err
        return
    }
    usersChan <- user
}()

select {
case users := <-usersChan:
    fmt.Printf("Fetched users: %+v\n", users)
case err := <-errChan:
    fmt.Printf("Error fetching users: %v\n", err)
case <-ctx.Done():
    fmt.Println("Request timed out")
}
ログイン後にコピー

この例では、内部サービスから受信した結果を記録するために usersChan を使用し、エラーを記録するために 2 番目のチャネル errChan を使用します。
遅い API からの応答が 2 秒以内に到着しない場合、エラーを検出し、外部レイヤーで正しく処理する機会を与えます。

リスク マネージャーを使用したこの実践的な例では、ゴルーチンによって非同期 HTTP リクエストが有効になり、コンテキストによってタイムアウト処理が保証されます。これは信頼性が高く回復力のあるマイクロサービスを構築するために重要です。

追伸

この記事は、基本的な知識はあるものの、その知識をどこに応用できるかがよくわからない初心者開発者を対象としています。フィードバックをお待ちしております。また、ご質問にも喜んでお答えいたします。
Go 言語の最も基本的なものの実際の例とその他のいくつかの実装は、私の GitHub のリンクにあります

以上がGolang が最初の作業タスクをどのように解決するかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!