100

私は GAE 用のアプリを作成して Go を学習しています。これはハンドラー関数の署名です。

func handle(w http.ResponseWriter, r *http.Request) {}

私はここではポインターの初心者ですが、なぜRequestオブジェクトはポインターなのResponseWriterですか? このようにする必要はありますか、それとも、ある種の高度なポインターベースのコードを可能にするためだけですか?

4

5 に答える 5

79

得られるのwは、エクスポートされていない型へのポインターですが、インターフェイスとhttp.response同様に、それは表示さResponseWriterれません。

server.goから:

type ResponseWriter interface {
    ...
}

一方、rは具体的な構造体へのポインターであるため、参照を明示的に渡す必要があります。

request.goから:

type Request struct {
    ...
}
于 2012-11-06T17:08:37.390 に答える
35

http.ResponseWriterインターフェースであり、このインターフェースを実装する既存のタイプはポインターです。つまり、このインターフェイスはすでにポインタによって「バックアップ」されているため、このインターフェイスへのポインタを使用する必要はありません。この概念は、ここでgo開発者の1人によって少し説明されています。http.ResponseWriterを実装するタイプはポインターである必要はありませんが、少なくともgohttpサーバー内では実用的ではありません。

http.Requestはインターフェースではなく、単なる構造体です。この構造体を変更してWebサーバーにそれらの変更を認識させたいので、ポインターである必要があります。構造体の値だけの場合は、コードを呼び出すWebサーバーが認識できないコピーを変更するだけです。

于 2012-11-06T17:33:57.940 に答える
2

これが Request へのポインターである理由は単純です。ハンドラーによる Request への変更はサーバーに表示される必要があるため、値ではなく参照によって渡すだけです。

net/http ライブラリ コードを掘り下げると、ResponseWriter がエクスポートされていない構造体応答へのインターフェイスであり、値ではなく参照によって構造体を渡している (応答へのポインターを渡している) ことがわかります。 . ResponseWriter は、ハンドラーが HTTP 応答を作成するために使用するインターフェースです。ResponseWriter をバックアップする実際の構造体は、エクスポートされていない構造体 http.response です。エクスポートされていないため、直接使用することはできません。ResponseWriter インターフェイスを介してのみ使用できます。

つまり、両方のパラメーターが参照によって渡されます。メソッドのシグネチャが、構造体へのポインターへのインターフェイスである ResponseWriter を受け取るだけなので、値で渡されたかのように見えます。

于 2018-02-08T06:38:01.820 に答える
1

Requestオブジェクトがポインタとして渡される主な理由はフィールドだと思いBodyます。特定の HTTP リクエストについて、ボディは 1 回しか読み取れません。オブジェクトが複製された場合はRequest、ポインターとして渡されなかった場合と同様に、本体から読み取られた量に関する異なる情報を持つ 2 つのオブジェクトが作成されます。

于 2016-11-20T18:17:36.907 に答える