GoではListenAndServeの第2引数にメインのルーターを指定できます。
参考 Go Web Examplesの和訳 Routing (using gorilla/mux) - HTTPサーバーのルーターの設定
標準のDefaultServeMuxを使っても良いですが、有名なRoutingライブラリとして、gorilla/muxとchiがあります。どちらを使ったら良いか周りで話題にあがっていてたので少し調べてみました。
比較対象 | gorilla/mux | chi |
---|---|---|
スター数 | 7,028 | 4,114 |
ライセンス | BSD-3-Clause | MIT |
コード行数(テスト含む) | 4317 | 2065 |
コード行数(テストコードを除く) | 1127 | 1256 |
サポートGoバージョン | 1.7+ | 1.7+ |
http.ServeMux互換性 | 互換 | 互換 |
ミドルウェアサポート | サポートあり | 豊富に提供 |
Graceful Shutdown | 実装例あり | 実装例あり |
テスト | 実装例あり | 実装例あり |
コードの計測にはgoclocを使用しました。
chiの方が若干コード量は少ないようです。(100行弱程度)
書き味の違い
適当なハンドラを比べてみると、chiの方がよりシンプルに書けることが分かります。
// gorilla
r.HandleFunc("/products", handler).Methods("POST")
//chi
r.Post("/products", handler)
またchiではLoggerやgzip圧縮などの良くある処理をオプションのミドルウェアで提供しています。
まとめ
簡単な利用ではgorilla/muxで十分そうですが、少し複雑なことをしたくなるとchiの方が機能を追加しやすく読みやすい印象を受けました。以下に計測した時の結果を貼っておきます。
chiは2065行
chi_loc.txt
gocloc . --include-lang=Go --by-file --not-match-d=_examples
--------------------------------------------------------------------------------------
File files blank comment code
--------------------------------------------------------------------------------------
mux.go 63 248 148
middleware/throttle_test.go 52 9 143
middleware/compress.go 29 45 138
middleware/strip_test.go 26 6 115
middleware/logger.go 24 22 112
middleware/wrap_writer.go 17 25 112
middleware/content_charset_test.go 19 0 105
mux_test.go 214 1351 99
context.go 24 48 89
middleware/throttle.go 15 9 77
middleware/middleware18_test.go 10 7 60
middleware/get_head_test.go 7 0 59
tree.go 136 650 58
middleware/middleware_test.go 11 3 50
middleware/request_id.go 11 27 50
middleware/realip_test.go 12 0 45
middleware/terminal.go 7 14 42
middleware/content_charset.go 8 4 39
middleware/strip.go 4 5 39
middleware/content_type.go 6 3 36
chi.go 17 82 35
middleware/nocache.go 10 14 34
tree_test.go 71 364 32
middleware/url_format.go 10 32 30
middleware/wrap_writer18.go 8 3 30
chain.go 9 11 29
middleware/realip.go 8 17 29
middleware/closenotify17.go 7 7 28
middleware/get_head.go 6 5 28
middleware/wrap_writer_test.go 7 0 26
middleware/recoverer.go 7 7 25
middleware/wrap_writer17.go 6 3 25
middleware/timeout.go 3 23 22
middleware/heartbeat.go 2 4 20
middleware/profiler.go 7 31 17
middleware/value.go 2 1 14
middleware/compress18.go 3 1 11
middleware/closenotify18.go 3 7 7
middleware/middleware.go 2 3 7
--------------------------------------------------------------------------------------
TOTAL 39 883 3091 2065
--------------------------------------------------------------------------------------
gorilla/muxは4317行
gorilla_mux_loc.txt
gocloc . --include-lang=Go --by-file
---------------------------------------------------------------------------------------------
File files blank comment code
---------------------------------------------------------------------------------------------
mux_test.go 146 56 2171
old_test.go 75 52 577
route.go 76 242 445
mux.go 67 173 348
middleware_test.go 78 14 285
regexp.go 24 59 249
middleware.go 12 11 49
bench_test.go 8 3 38
example_authentication_middleware_test.go 7 5 34
example_route_test.go 10 12 29
context_native_test.go 5 1 26
context_gorilla_test.go 12 3 25
context_gorilla.go 7 1 18
context_native.go 6 1 17
test_helpers.go 3 11 5
doc.go 82 223 1
---------------------------------------------------------------------------------------------
TOTAL 16 618 867 4317
---------------------------------------------------------------------------------------------