技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

速くて簡単。サードパーティの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に関する諸注意などは下記ドキュメントに記載があります。

httprouter - GoDoc