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誰かが最善を尽くし、あなたの会社にはユーザーをリストする内部サービスがあるとします。私たちのタスクは、新しいリスク マネージャーでユーザー リストを再利用することです (ユーザー データ構造は 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 サイトの他の関連記事を参照してください。