わたしとゴリラとジンと

---
わたしと<font color="red">ゴリラ</font>とジンと
---

**ゴリラ・ゴリラ・ゴリラ**

エンジニアはB型が多いらしいです。

ゴリラは全員B型らしいです。


つまりゴリラはエンジニアってこと？

エンジニアがゴリラってこと？

ゴリラとエンジニアの間をとって

ゴジラにしましょう（謎提案）

<br>

**目次**
- [1. gorillaとは何か](#1-gorillaとは何か)
- [2. gorillaとginの違い](#2-gorillaとginの違い)
- [3. おわりに](#3-おわりに)

## 1. gorillaとは何か

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493200/9b09366c-7472-7e6a-c0a3-94e747922be0.png)

[Gorilla, the golang web toolkit](https://gorilla.github.io/)

　ゴリラは、霊長目ヒト科ゴリラ属に分類される構成種の総称。

　アンゴラ（カビンダ）、ウガンダ、ガボン、カメルーン南部、コンゴ共和国に分布しています。ギリシャ語で「毛深い部族」という意味の「Γόριλλαι (gorillai)」が由来と.....おっと違いますよね。


　gorillaは、Go言語（Golang）でWebアプリケーションを開発するための一連のパッケージからなるオープンソースのプロジェクトです。

　`gorilla/mux`はその中でも特に人気のあるパッケージの一つで、強力なURLルーターおよびディスパッチャーとして機能します。
 
　gorillaのツールキットは、Goの標準`net/http`ライブラリを補完し、Web開発における一般的な課題を解決するための便利な機能を提供します。

　因みに、gorillaの由来は分からなかったのですが、`mux`は"HTTP request multiplexer"の略であり、標準のhttp.ServeMuxのように、登録されたルートのリストに対して着信リクエストをマッチさせ、URLやその他の条件に一致するルートのハンドラを呼び出す役割を持つ、リクエストルーターおよびディスパッチャーの実装を指します​​。

>参考
[Gorilla Mux](https://pkg.go.dev/github.com/gorilla/mux)

[この記事](https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a)がわかりやすかったです。


<font color="low blue">**使用例**</font>

```go
package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, gorilla/mux!")
    })

    http.ListenAndServe(":8080", r)
}

```

 このコードは、ルートパス(/)にアクセスしたときに`Hello, gorilla/mux!`と表示するWebサーバーを起動します。

## 2. gorillaとginの違い

　私は普段[gin](https://gin-gonic.com/ja/)を使っているのですが、今回はその違いにも調べてみようと思います。

　gorilla/muxとginは、Go言語でWebアプリケーションやAPIを構築するための2つの人気のあるフレームワークです。それぞれ異なる特徴と設計哲学を持ち、開発者がプロジェクトの要件に応じて選択できるようになっています。


<font color="low blue">**gorillaとginの違い**</font>

| 特徴           | gorilla/mux                                                                                      | gin                                                                                                                                                     |
|--------------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
| ルーティングの柔軟性 | URLパス、クエリパラメータ、HTTPメソッドに基づく条件付きルーティングや、正規表現を使用したパラメータマッチングをサポート。 | ルーティングの処理速度が高速だが、パスパラメータのマッチングに正規表現を直接使用することはできない。                                                      |
| 設計           | モジュラー設計で、必要な機能のみを選択して使用可能。各パッケージは独立している。                                     | 組み込み機能が豊富で、外部ライブラリへの依存を減らすことができる。シンプルかつ直感的なAPIを提供し、迅速に開発を進めることができる。                               |
| セッション管理  | `gorilla/sessions`パッケージを通じてセッション管理がサポートされており、セキュリティ機能も充実。                     | 組み込みのセッション管理機能は提供していないが、ミドルウェアや外部ライブラリを使用してセッション管理を実装することが可能。                                  |
| パフォーマンス   | 柔軟なルーティングとモジュラー設計により、若干のオーバーヘッドが生じる場合がある。                                  | ルーティングの処理速度が非常に高速であり、パフォーマンスを最優先に設計されている。                                                                    |
| 使いやすさ       | 柔軟性の高いルーティングを実現するためには、より詳細な設定が必要になる場合がある。                                  | シンプルかつ直感的なAPIにより、少ないコードで迅速にアプリケーションを開発できる。                                                                       |
| 適用シナリオ     | 複雑なルーティングルールや細かい制御が必要な場合に適している。                                               | 小規模から大規模なアプリケーションにわたって応答時間を短縮することが重要な場合、または開発の迅速化を優先する場合に適している。                                 |


<font color="low blue">**gorillaとginの正規表現の例**</font>


<font color="green">**gorilla/muxの場合**</font>


　`gorilla/mux`では、ルート定義時にパスパラメータに対して直接正規表現を適用することが可能です。

　この機能を利用すると、特定のパターンに一致するリクエストのみを処理するハンドラを簡単に定義できます。

　例えば、以下のコードでは`/documents/{id}`のidが数字のみである場合にマッチし、それ以外の場合はマッチしません。

```gorilla.go
package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

	r.HandleFunc("/documents/{id:[0-9]+}", func(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        id := vars["id"]
        fmt.Fprintf(w, "Document ID: %s", id)
    })
	
    http.ListenAndServe(":8080", r)
}
```

　これを実行しすると、下記のようなことができるようになります。

```bash
curl http://localhost:8080/documents/11
```

出力
```
Document ID: 11
```

<font color="green">**ginの場合**</font>

　一方、ginフレームワークでは、ルート定義時に正規表現を直接適用することはできません。

　しかし、ルートハンドラ内でパラメータの値を検証することにより、同様の制約を実現することが可能です。

　以下の例では、`/documents/:id`のルートで取得したidパラメータが数字のみで構成されているかどうかを`regexp.MatchString`関数を使用して検証しています。

```gin.go
package main

import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
    "regexp"
)

func main() {
    r := gin.Default()

    r.GET("/documents/:id", func(c *gin.Context) {
        id := c.Param("id")
        match, _ := regexp.MatchString(`^[0-9]+$`, id)
        if match {
            c.String(http.StatusOK, "Document ID: %s", id)
        } else {
            c.String(http.StatusBadRequest, "Invalid ID")
        }
    })
	
    r.Run(":8080") // デフォルトで8080ポートでサーバーを起動
}

```


## 3. おわりに

　正規表現を気にせず使えるのは確かに便利だな、と思いました。
 
　名前もイカしているので、折あれば使っていこうと思います。

　あとゴリラの由来を知っている方がいらっしゃれば、コメントして頂けると嬉しいです。