速くて簡単。サードパーティのServeMux【Go】
packageの紹介
こちらのhttprouter packageは、net/http packageのServeMuxよりもルーティングが高速で、かつ使いやすいと評判です。
GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well
パフォーマンスについて、下記のようにベンチマークも取られ、実証されています。
GitHub - julienschmidt/go-http-routing-benchmark: Go HTTP request router and web framework benchmark
使い方
初期化されたrouterを作成し、HTTPのMethodルールに基づくメソッドでルーティングを指定します。 あとはListenAndServe()をするだけです。
func Hello(w http.ResponseWriter, req *http.Request, _ httprouter.Params) { // httprouter.Handle型の定義に合わせた3つの引数 fmt.Fprint(w, "Hello!") } func afterPost(w http.ResponseWriter, req *http.Request, _ httprouter.Params) { ... } func main() { router := httprouter.New() router.GET("/hello", Hello) // 「/hello」にアクセスしたらHelloを実行する。第2引数はhttprouter.Handle型 router.POST("/blog/comment/", afterPost) http.ListenAndServe(":8080", router) }
httprouterのメソッドには、他にもHEAD()やOPTIONS()などが存在します。
またルーティングに定義するURLパスに、名前付きパラメータを使用して、動的なルーティングを行うことも可能です。
router.GET("/bye/:user", Bye) // userの部分は「名前」であり、実際のアクセスURLでは何でもよい
上記例ですと、「/bye/bob」でも「/bye/mike」でもアクセスするとByeが実行され、Bye, bobやBye, mikeと表示されます。
このように名前付きパラメータを用いると、userという名前でbobやmikeが特定できることになります。
つまり、次のようにhttprouter.Handleで利用することができます。
func Bye(w http.ResponseWriter, req *http.Request, pm httprouter.Params) { fmt.Fprintf(w, "Bye, %v.", pm.ByName("user")) } func main() { router := httprouter.New() router.GET("/bye/:user", Bye) http.ListenAndServe(":8080", router) }
httprouter.Handleの第3引数はhttprouter.Paramsです。
ここからByName()メソッドを使って、パラメータに指定された内容を取得することができます。
指定した名前が存在しない場合は、空文字を返します。
他の使い方や、ルーティングする際のURLに関する諸注意などは下記ドキュメントに記載があります。