1. ホーム
  2. go

[解決済み] http.Handleとhttp.HandleFuncの違いとは?

2023-07-04 17:35:29

質問

Goのドキュメントには、httpパッケージの次のような例があります。

http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

HandleとHandleFuncの違いと、なぜ2つが必要なのかを理解するのにちょっと苦労しています。誰か、新しいGopherに明確な言葉で説明してくれませんか?

どのように解決するのですか?

基本的に、HTTPサーバのquot;mux"には、パス -> ハンドラインタフェースのマップがあります。

ここでインタフェースが使われているのは、状態を持つ複雑なパスハンドラを実装できるようにするためだと思われます。

例えば ファイルサーバー は、ファイルサービスのルートディレクトリを含む構造体であり、ハンドラインタフェースを実装しています。

とはいえ、単純なものであればfuncの方が簡単でわかりやすい。 そこで、簡単にfuncを渡せるように、特別なジェネレータを追加したのです。

見てみてください。 server.go

行目から:1216(本日現在)

  1216  type HandlerFunc func(ResponseWriter, *Request)
  1217  
  1218  // ServeHTTP calls f(w, r).
  1219  func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  1220      f(w, r)
  1221  }

彼らがやっていることは、自分自身を呼び出すだけのカスタムタイプ(たまたまインターフェースのAPIと一致する)にインターフェースを実装しているのです。