oinume journal

Scratchpad of what I learned

GoのWeb Application Frameworkでオススメは?

GoのWeb Application Frameworkでオススメは?という質問をよく受ける。 標準ライブラリのhttpパッケージ使えばおk とまずは返答している。ただ、RESTで様々なHTTPメソッドをサポートする必要があり、かつ /v1/users/{id} のようなPath内にIDが入る場合の対応を行いたい場合は

あたりの標準のhttpパッケージに沿ったものをオススメしている。理由としては以下。

  • ユニットテストで標準ライブラリのhttptestパッケージが使える(これ重要)
  • 他の標準のhttpパッケージに沿ったフレームワークに乗り換えやすい
    • もし乗り換えた場合でもテストコードは書き換えなくてよいはず

標準のhttpパッケージに沿ったもの、というのは、 ハンドラを登録する時に http.Handler を受け付けられるものという意味で書いている。

パフォーマンスが気になる人は以下を見ておけばいいのではないかと思うが、個人的にはWeb Application FrameworkのパフォーマンスはDBアクセスなどのNetwork I/Oに比べれば誤差だと思うのであんまり気にしなくていいのではないかと思う。

github.com

参考までに、gorilla/mux でRESTfulなAPIをサポートするコードは以下のような感じ

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/v1/users/{id:[0-9]+}", usersHandler).Methods("GET")
    log.Fatal(http.ListenAndServe("localhost:5000", router))
}

func usersHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Your id is %v", vars["id"]) // Path内のid
}

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発