Edited at

golang gorilla/mux vs chi

More than 1 year has passed since last update.

GoではListenAndServeの第2引数にメインのルーターを指定できます。

参考 Go Web Examplesの和訳 Routing (using gorilla/mux) - HTTPサーバーのルーターの設定

標準のDefaultServeMuxを使っても良いですが、有名なRoutingライブラリとして、gorilla/muxchiがあります。どちらを使ったら良いか周りで話題にあがっていてたので少し調べてみました。

比較対象
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
---------------------------------------------------------------------------------------------


参考