[解決済み] 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と一致する)にインターフェースを実装しているのです。
関連
-
[解決済み] パラメータと戻り値におけるポインタと値の比較
-
[解決済み] Goの:=と=の演算子の違い
-
[解決済み] "宣言されているが使用されていない "という迷惑なエラーを回避する方法
-
[解決済み] Goにおけるfmt.Println()とprintln()の相違点
-
[解決済み] ゴルーチンの停止方法
-
[解決済み] スライスを変数入力として渡すには?
-
[解決済み] あるプログラムの依存ファイルをすべて取得する方法
-
[解決済み] Goにはラムダ式というものがあるのですか?
-
[解決済み] チャネルバッファサイズとは何ですか?
-
[解決済み] http.HandleFuncのパターンにおけるワイルドカードについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] サーバーでSSLが有効になっていない
-
[解決済み] ゴルーチンの停止方法
-
[解決済み] 単一値コンテキストにおける複数値
-
[解決済み] Goプロジェクトの賢明なレイアウト方法とは [終了しました]。
-
[解決済み] go モジュール内のローカルパッケージへのアクセス (go 1.11)
-
[解決済み] 構造体の値をマップの値として設定すると、"cannot assign" エラーが発生するのはなぜですか?重複
-
[解決済み] ローカルファイルからio.Readerを作成する
-
[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?
-
[解決済み] gc」と「gccgo」の主な相違点は何ですか?
-
[解決済み] 終了コードを取得する - Go