今日のインターネット時代では、多くのアプリケーションはデータを取得または送信するためにネットワーク要求を行う必要があります。 HTTP リクエストは、最も一般的に使用されるネットワーク リクエスト メソッドの 1 つです。 Go 言語では、標準ライブラリの net/http パッケージを使用して HTTP リクエストを開始できますが、これにより現在のコルーチンがブロックされます。では、Go 言語で非同期 HTTP リクエストを実装するにはどうすればよいでしょうか?この記事では、Go 言語で非同期 HTTP リクエストを実装する 2 つの方法を紹介します。
方法 1: goroutine とチャネルを使用する
Goroutine を使用すると非同期プログラミングを簡単に実装でき、チャネルを使用するとコルーチン間の通信が容易になります。したがって、ゴルーチンで HTTP リクエストを開始し、チャネルを使用して応答をメインのゴルーチンに返すことができます。以下は簡単な例です:
func asyncHTTP(url string, ch chan<- []byte) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } ch <- body } func main() { ch := make(chan []byte) url := "https://www.example.com" go asyncHTTP(url, ch) fmt.Println("Waiting for response...") responseBody := <-ch fmt.Println("Received response:", string(responseBody)) }
上の例では、まず ch (タイプ chan []byte) を作成して、応答結果をメイン コルーチンに返します。次に、asyncHTTP
関数を呼び出して HTTP リクエストを開始し、応答結果を ch に書き込みます。最後に、 演算子を使用して ch からの応答結果を読み取ります。
HTTP リクエストがゴルーチンを通じて開始されない場合、応答結果を読み取る操作 により現在のコルーチンがブロックされることに注意してください。 goroutine とチャネルを使用すると、非同期 HTTP リクエストを簡単に実装できます。
方法 2: コンテキストと http.Do
を使用する Go 言語では、コンテキスト パッケージを使用して関数の実行時間とキャンセル可能性を制御できます。コンテキストを http.Do 関数と組み合わせて使用すると、キャンセル可能な非同期 HTTP リクエストを実装できます。以下は簡単な例です:
func asyncHTTPWithCtx(ctx context.Context, url string) ([]byte, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { return nil, err } client := http.DefaultClient resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return body, nil } func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() url := "https://www.example.com" resp, err := asyncHTTPWithCtx(ctx, url) if err != nil { log.Fatal(err) } fmt.Println("Response:", string(resp)) }
上の例では、context.WithTimeout
関数を使用してキャンセル可能なコンテキストを作成します。次に、asyncHTTPWithCtx
関数を呼び出します。この関数は、http.Do 関数を使用して HTTP リクエストを開始します。 http.Do 関数はコンテキスト パラメーターを受け入れることができ、コンテキストがキャンセルされると、http.Do 関数は実行中の HTTP リクエストをキャンセルします。
http.Do 関数を使用する場合、応答本文を手動で閉じる必要があることに注意してください。そうしないと、リソース リークや接続プールの枯渇が発生する可能性があります。したがって、asyncHTTPWithCtx
関数では、defer ステートメントを使用して、関数が戻ったときに応答本文が確実に閉じられるようにします。
概要
この記事では、Go 言語で非同期 HTTP リクエストを実装する 2 つの方法、ゴルーチンとチャネルを使用する方法、およびコンテキストと http.Do 関数を使用する方法を紹介します。 goroutine とチャネルを使用する方法はより一般的な方法であり、あらゆる種類のネットワーク リソースを非同期に要求するために使用できます。 context 関数と http.Do 関数を使用する方法は、要求のキャンセルを制御する必要があるシナリオに適しています。これらのテクノロジーを使用すると、非同期 HTTP リクエストを簡単に実装でき、アプリケーションのパフォーマンスと応答性が向上します。
以上がGo 言語での非同期 HTTP リクエストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。