17

ここで何が起こっているのか知りたいです。

httpハンドラーのインターフェースは次のとおりです。

type Handler interface {
    ServeHTTP(*Conn, *Request)
}

この実装は私が理解していると思います。

type Counter int

func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
    fmt.Fprintf(c, "counter = %d\n", ctr);
    ctr++;
}

私の理解では、タイプ「Counter」は必要な署名を持つメソッドを持っているため、インターフェースを実装しているということです。ここまでは順調ですね。次に、この例を示します。

func notFound(c *Conn, req *Request) {
    c.SetHeader("Content-Type", "text/plain;", "charset=utf-8");
    c.WriteHeader(StatusNotFound);
    c.WriteString("404 page not found\n");
}

// Now we define a type to implement ServeHTTP:
type HandlerFunc func(*Conn, *Request)
func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
    f(c, req) // the receiver's a func; call it
}
// Convert function to attach method, implement the interface:
var Handle404 = HandlerFunc(notFound);

誰かがこれらのさまざまな機能がなぜまたはどのように組み合わされるのかについて詳しく説明できますか?

4

2 に答える 2

23

これ:

type Handler interface {
    ServeHTTP(*Conn, *Request)
}

Handlerインターフェイスを満たす型にはServeHTTPメソッドが必要であると述べています。上記はパッケージの内側になりますhttp

type Counter int

func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
    fmt.Fprintf(c, "counter = %d\n", ctr);
    ctr++;
}

これにより、ServeHTTP に対応する Counter タイプにメソッドが配置されます。以下とは別の例です。

私の理解では、必要な署名を持つメソッドがあるため、タイプ「カウンター」はインターフェースを実装しています。

それは正しい。

次の関数自体は として機能しませんHandler:

func notFound(c *Conn, req *Request) {
    c.SetHeader("Content-Type", "text/plain;", "charset=utf-8");
    c.WriteHeader(StatusNotFound);
    c.WriteString("404 page not found\n");
}

この残りの部分は、上記をフィッティングして、Handler.

次の aは、 へのポインターへのポインターHandlerFuncの 2 つの引数を取り、何も返さない関数です。つまり、これらの引数を取り、何も返さない関数は.ConnRequestHandlerFunc

// Now we define a type to implement ServeHTTP:
type HandlerFunc func(*Conn, *Request)

ServeHTTPtype に追加されたメソッドは次のとおりHandlerFuncです。

func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
    f(c, req) // the receiver's a func; call it
}

f引数を指定して関数自体 ( ) を呼び出すだけです。

// Convert function to attach method, implement the interface:
var Handle404 = HandlerFunc(notFound);

上記の行では、関数自体から人為的に型インスタンスを作成し、関数をインスタンスのメソッドにするnotFoundことで、 のインターフェイスに受け入れられるように仕上げています。インターフェイスで使用できるようになりました。それは基本的に一種のトリックです。HandlerServeHTTPHandle404Handler

于 2009-11-21T06:38:03.267 に答える
0

後半の何がわからないの?上と同じパターンです。Counter 型を int として定義する代わりに、notFound という関数を定義します。次に、接続と要求の 2 つのパラメーターを受け取る HandlerFunc というタイプの関数を作成します。次に、HandlerFunc タイプにバインドされる ServeHTTP という新しいメソッドを作成します。Handle404 は、notFound 関数を使用するこのクラスの単なるインスタンスです。

于 2009-11-21T02:08:26.493 に答える