GoでHTTPサーバー入門 [Handler][HandleFunc][ServeMux]

2019年9月12日

Go

net/httpパッケージを利用して、HTTPサーバーを起動してみます。

 

 

HandleFunc関数


 

まずはHandleFunc関数を利用した最も一般的でシンプルな実装を行い、Handler(インターフェイス)およびListenAndServe関数、また背後で機能するServeMux等を説明していきます。

 

HandleFunc関数の機能を掘り下げていくと、Go言語におけるサーバー実装の基本をより理解できるようになります。

 

http://localhost:8080/hello にアクセスすると、「Hello, World」と表示されるコードです。

HandleFunc関数の第1引数にはURLのパスを、第2引数にはそのパスに対して実行される関数を指定しています。上記では、/helloにアクセスした際に、helloHandler関数が実行されるように設定しています。

 

HandleFunc関数を説明する前に、Handlerについて確認しておきます。

 

HandlerとはServeHTTPという関数を定義したインターフェイスです。

8〜10行目のhelloHandler関数には、ResponseWriterとhttp.Requestの2つの引数がありますが、これはHandlerインターフェイスにおけるServeHTTP関数と同様のシグネチャを構成しています。

 

HandleFunc関数は下記のように定義されています。第2引数に関数を渡すと、DefaultServeMux.HandleFuncに登録されます。上述したコードで言えばHandlerのServeHTTP関数と同様のシグネチャを持つ関数、helloHandler関数を渡すことができます。

 

DefaultServeMuxはグローバルなServeMuxのインスタンスです。つまりnet/httpパッケージにおいてあらかじめDefaultServeMuxが用意されています。ServeMuxはリクエストマルチプレクサと呼ばれ、URLとHandlerの関連付けをおこなうルーターとしての役目を持ちます。

 

ServeMux型のHandleFuncメソッドの定義をみていきます。第2引数で関数を渡すとHandlerFunc(2行目)に渡されます。このHandlerFuncは型であり、適切なシグネチャを持った関数をHandlerに変換することができます。

 

更にHandlerFunc型の定義を見てみると、ServeHTTPメソッドを持ちServeMuxもHandlerであることが分かります(すわなちDefaultServeMuxもHandler)。また自身のHandlerFuncをfとして呼び出していることも確認できます。

 

上記までの説明をざっくりまとめると、HandleFunc関数によってHandlerのServeHTTP関数と同様のシグネチャを持つ関数はHandlerに変換され、またそのHandlerがDefaultServeMuxに登録されます。

 

ListenAndServe関数の第1引数にはアドレスを、第2引数にはHandlerを指定する必要がありますが、nilを指定するとDefaultServeMuxが機能するようになります。つまり下記と同じ挙動になります。
 
 
もしnilを利用しない場合は下記のような記述になります。NewServeMux関数を利用してmuxという名前のServeMuxを生成しています。ListenAndServeの第2引数にこのmuxを指定する必要があります。

はじめに提示したコードのようにhttp.HandleFunc関数を利用すればnilを指定することができ、よりシンプルな記述であったことがわかります。

 
 
 
Handle関数


 
次にHandle関数を利用したパターンです。
 

HandleFunc関数とは違い、Handle関数の第2引数には関数を指定しません。helloHandler型のServeHTTP関数を定義したHandlerのポインタを指定しています(15・16行目)。

 
 
構造体およびHandlerのインスタンスを作成する記述から、あらためてHandleFunc関数によるシンプルな記述が確認できたと思います。
 
 
 
参照文献

 

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)  Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る (impress top gear) 

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー