http.Request のポインター要件を理解する
Go プログラミング言語では、大きな構造を効率的に処理するためにポインターが不可欠です。受信 HTTP リクエストを表す http.Request 型は、そのような構造の代表的な例です。
Go の構文では、ポインターは別の値のアドレスを格納するデータ型です。パラメーターがポインターによって渡される場合、関数内でそのパラメーターに加えられた変更はすべてグローバルに反映されます。
http.Request の場合、構造体はかなりの量であり、それをコピーすると計算コストが高くなります。ポインタを使用すると、関数が元の構造体に直接アクセスできるため、メモリと処理時間を節約できます。
次の例を考えてみましょう。
// Using a pointer
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
})
* が http.Request タイプから削除されると、エラー メッセージが表示されます:
cannot use func literal (type func(http.ResponseWriter, http.Request)) as type func(http.ResponseWriter, *http.Request) in argument to http.HandleFunc
の引数に func(http.ResponseWriter, *http.Request) を入力します。これは、HTTP ハンドラー関数 (HandleFunc) が引数として ResponseWriter と Request へのポインターを取る関数を予期しているためです。構造体へのポインタは、事実上、元の構造体への参照となり、関数内で行われた変更を関数の外部から参照できるようになります。
対照的に、リテラル関数はすぐに実行され、値を返します。これは、ステートフル HTTP リクエスト オブジェクトの処理には適していません。
http.Request へのポインタを使用することにより、Go は大きな構造の不必要なコピーを回避し、メモリ使用量を最適化し、ハンドラー関数内で行われた変更が確実に反映されるようにします。グローバルに反映されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3