golang gorilla/mux vs chi

Goでは[ListenAndServe](https://golang.org/pkg/net/http/#ListenAndServe)の第2引数にメインのルーターを指定できます。
[参考 Go Web Examplesの和訳 Routing (using gorilla/mux) - HTTPサーバーのルーターの設定](https://qiita.com/tikidunpon/items/b3a926d9146d55eb0848#http%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A)  

標準のDefaultServeMuxを使っても良いですが、有名なRoutingライブラリとして、[gorilla/mux](https://github.com/gorilla/mux)と[chi](https://github.com/go-chi/chi)があります。どちらを使ったら良いか周りで話題にあがっていてたので少し調べてみました。

| 比較対象  | gorilla/mux  |  chi |
|---|---|---|
| スター数  | 7,028  | 4,114  |
| ライセンス  | BSD-3-Clause  | MIT |
| コード行数（テスト含む）  | 4317  | 2065  |
| コード行数（テストコードを除く）  | 1127  | 1256  |
| サポートGoバージョン  | 1.7+  | 1.7+  |
| http.ServeMux互換性  | 互換  | 互換  |
| ミドルウェアサポート | [サポートあり](https://github.com/gorilla/mux#middleware)  | [豊富に提供](https://github.com/go-chi/chi#middlewares)  |
| Graceful Shutdown | [実装例あり](https://github.com/gorilla/mux#graceful-shutdown)  | [実装例あり](https://github.com/go-chi/chi/blob/master/_examples/graceful/main.go)  |
| テスト  | [実装例あり](https://github.com/gorilla/mux#testing-handlers)  | [実装例あり](https://github.com/go-chi/chi/blob/master/mux_test.go#L1138)  |


コードの計測には[gocloc](https://github.com/hhatto/gocloc)を使用しました。
chiの方が若干コード量は少ないようです。（100行弱程度）

## 書き味の違い
適当なハンドラを比べてみると、chiの方がよりシンプルに書けることが分かります。

```
// gorilla
r.HandleFunc("/products", handler).Methods("POST")

//chi
r.Post("/products", handler)

```

またchiではLoggerやgzip圧縮などの良くある処理を[オプションのミドルウェア](https://github.com/go-chi/chi#middlewares)で提供しています。

## まとめ  
簡単な利用では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
---------------------------------------------------------------------------------------------
```

## 参考
- [Goのhttpルーター「Chi」の紹介
](https://qiita.com/minoritea/items/afaf10de3c5b6ebafa84)