[Handler][HandleFunc][ServeMux]2019年9月12日Gonet/httpパッケージを利用して、HTTPサーバーを起動してみます。HandleFunc関数まずはHandleFunc関数を利用した最も一般的でシンプルな実装を行い、Handler(インターフェイス)およびListenAndServe関数、また背後で機能するServeMux等を説明していきます。HandleFunc関数の機能を掘り下げていくと、Go言語におけるサーバー実装の基本をより理解できるようになります。World」と表示されるコードです。nil)}HandleFunc関数の第1引数にはURLのパスを、第2引数にはそのパスに対して実行される関数を指定しています。上記では、/helloにアクセスした際に、helloHandler関数が実行されるように設定しています。HandleFunc関数を説明する前に、Handlerについて確認しておきます。HandlerとはServeHTTPという関数を定義したインターフェイスです。*Request)}8〜10行目のhelloHandler関数には、ResponseWriterとhttp.Requestの2つの引数がありますが、これはHandlerインターフェイスにおけるServeHTTP関数と同様のシグネチャを構成しています。HandleFunc関数は下記のように定義されています。第2引数に関数を渡すと、DefaultServeMux.HandleFuncに登録されます。上述したコードで言えばHandlerのServeHTTP関数と同様のシグネチャを持つ関数、helloHandler関数を渡すことができます。handler)}DefaultServeMuxはグローバルなServeMuxのインスタンスです。net/httpパッケージにおいてあらかじめDefaultServeMuxが用意されています。ServeMuxはリクエストマルチプレクサと呼ばれ、URLとHandlerの関連付けをおこなうルーターとしての役目を持ちます。ServeMux型のHandleFuncメソッドの定義をみていきます。第2引数で関数を渡すとHandlerFunc(2行目)に渡されます。このHandlerFuncは型であり、適切なシグネチャを持った関数をHandlerに変換することができます。HandlerFunc(handler))}更にHandlerFunc型の定義を見てみると、ServeHTTPメソッドを持ちServeMuxもHandlerであることが分かります(すわなちDefaultServeMuxもHandler)。自身のHandlerFuncをfとして呼び出していることも確認できます。r)}上記までの説明をざっくりまとめると、HandleFunc関数によってHandlerのServeHTTP関数と同様のシグネチャを持つ関数はHandlerに変換され、またそのHandlerがDefaultServeMuxに登録されます。ListenAndServe関数の第1引数にはアドレスを、第2引数にはHandlerを指定する必要がありますが、nilを指定するとDefaultServeMuxが機能するようになります。下記と同じ挙動になります。http.DefaultServeMux)もしnilを利用しない場合は下記のような記述になります。NewServeMux関数を利用してmuxという名前のServeMuxを生成しています。ListenAndServeの第2引数にこのmuxを指定する必要があります。mux)}はじめに提示したコードのようにhttp.HandleFunc関数を利用すればnilを指定することができ、よりシンプルな記述であったことがわかります。次にHandle関数を利用したパターンです。nil)}HandleFunc関数とは違い、Handle関数の第2引数には関数を指定しません。helloHandler型のServeHTTP関数を定義したHandlerのポインタを指定しています(15・16行目)。構造体およびHandlerのインスタンスを作成する記述から、あらためてHandleFunc関数によるシンプルな記述が確認できたと思います。