ホームページ  >  記事  >  バックエンド開発  >  Go ではなぜ `http.Request` 引数がポインタである必要があるのでしょうか?

Go ではなぜ `http.Request` 引数がポインタである必要があるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-25 02:19:30331ブラウズ

Why Does the `http.Request` Argument Need to Be a Pointer in Go?

なぜ HTTP リクエストの引数はポインタでなければならないのですか?

Go では、http.Request 型は HTTP リクエストに関するさまざまな情報を含む大きな構造体です。 HTTP リクエストを効率的に処理するために、Go はポインターを使用して、大規模なデータ構造をコピーするオーバーヘッドを回避します。

<code class="go">package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("hello world"))
    })
    http.ListenAndServe(":8000", nil)
}</code>

*http.Request のアスタリスク (*) を削除すると、関数が関数であるためエラーが発生します。リテラルは、http.Request 型へのポインタを期待します。

<code class="go">  <p>github.com/creating_web_app_go/main.go:8: cannot use func literal (type func(http.ResponseWriter, http.Request)) as type func(http.ResponseWriter, *http.Request) in argument to http.HandleFunc</p></code>

ポインタは、オブジェクト自体のコピーではなく、オブジェクトへの参照を渡すために Go で使用されます。これは、特に http.Request のような大規模な構造の場合、より効率的です。さらに、http.Request には、HTTP ヘッダーやリクエスト本文などの状態情報が含まれており、コピーすると混乱を招く可能性があります。

したがって、http.Request 引数は、HTTP リクエストを効率的に処理するためのポインタである必要があります。そして、そこに含まれる状態情報の整合性を維持します。

以上がGo ではなぜ `http.Request` 引数がポインタである必要があるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。