LoginSignup
2

More than 5 years have passed since last update.

golang gorilla/mux vs chi

Last updated at Posted at 2018-09-14

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
---------------------------------------------------------------------------------------------

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2