わたしとゴリラとジンと
ゴリラ・ゴリラ・ゴリラ
エンジニアはB型が多いらしいです。
ゴリラは全員B型らしいです。
つまりゴリラはエンジニアってこと?
エンジニアがゴリラってこと?
ゴリラとエンジニアの間をとって
ゴジラにしましょう(謎提案)
目次
1. gorillaとは何か
Gorilla, the golang web toolkit
ゴリラは、霊長目ヒト科ゴリラ属に分類される構成種の総称。
アンゴラ(カビンダ)、ウガンダ、ガボン、カメルーン南部、コンゴ共和国に分布しています。ギリシャ語で「毛深い部族」という意味の「Γόριλλαι (gorillai)」が由来と.....おっと違いますよね。
gorillaは、Go言語(Golang)でWebアプリケーションを開発するための一連のパッケージからなるオープンソースのプロジェクトです。
gorilla/mux
はその中でも特に人気のあるパッケージの一つで、強力なURLルーターおよびディスパッチャーとして機能します。
gorillaのツールキットは、Goの標準net/http
ライブラリを補完し、Web開発における一般的な課題を解決するための便利な機能を提供します。
因みに、gorillaの由来は分からなかったのですが、mux
は"HTTP request multiplexer"の略であり、標準のhttp.ServeMuxのように、登録されたルートのリストに対して着信リクエストをマッチさせ、URLやその他の条件に一致するルートのハンドラを呼び出す役割を持つ、リクエストルーターおよびディスパッチャーの実装を指します。
参考
Gorilla Mux
この記事がわかりやすかったです。
使用例
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を使っているのですが、今回はその違いにも調べてみようと思います。
gorilla/muxとginは、Go言語でWebアプリケーションやAPIを構築するための2つの人気のあるフレームワークです。それぞれ異なる特徴と設計哲学を持ち、開発者がプロジェクトの要件に応じて選択できるようになっています。
gorillaとginの違い
特徴 | gorilla/mux | gin |
---|---|---|
ルーティングの柔軟性 | URLパス、クエリパラメータ、HTTPメソッドに基づく条件付きルーティングや、正規表現を使用したパラメータマッチングをサポート。 | ルーティングの処理速度が高速だが、パスパラメータのマッチングに正規表現を直接使用することはできない。 |
設計 | モジュラー設計で、必要な機能のみを選択して使用可能。各パッケージは独立している。 | 組み込み機能が豊富で、外部ライブラリへの依存を減らすことができる。シンプルかつ直感的なAPIを提供し、迅速に開発を進めることができる。 |
セッション管理 |
gorilla/sessions パッケージを通じてセッション管理がサポートされており、セキュリティ機能も充実。 |
組み込みのセッション管理機能は提供していないが、ミドルウェアや外部ライブラリを使用してセッション管理を実装することが可能。 |
パフォーマンス | 柔軟なルーティングとモジュラー設計により、若干のオーバーヘッドが生じる場合がある。 | ルーティングの処理速度が非常に高速であり、パフォーマンスを最優先に設計されている。 |
使いやすさ | 柔軟性の高いルーティングを実現するためには、より詳細な設定が必要になる場合がある。 | シンプルかつ直感的なAPIにより、少ないコードで迅速にアプリケーションを開発できる。 |
適用シナリオ | 複雑なルーティングルールや細かい制御が必要な場合に適している。 | 小規模から大規模なアプリケーションにわたって応答時間を短縮することが重要な場合、または開発の迅速化を優先する場合に適している。 |
gorillaとginの正規表現の例
gorilla/muxの場合
gorilla/mux
では、ルート定義時にパスパラメータに対して直接正規表現を適用することが可能です。
この機能を利用すると、特定のパターンに一致するリクエストのみを処理するハンドラを簡単に定義できます。
例えば、以下のコードでは/documents/{id}
のidが数字のみである場合にマッチし、それ以外の場合はマッチしません。
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)
}
これを実行しすると、下記のようなことができるようになります。
curl http://localhost:8080/documents/11
出力
Document ID: 11
ginの場合
一方、ginフレームワークでは、ルート定義時に正規表現を直接適用することはできません。
しかし、ルートハンドラ内でパラメータの値を検証することにより、同様の制約を実現することが可能です。
以下の例では、/documents/:id
のルートで取得したidパラメータが数字のみで構成されているかどうかをregexp.MatchString
関数を使用して検証しています。
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. おわりに
正規表現を気にせず使えるのは確かに便利だな、と思いました。
名前もイカしているので、折あれば使っていこうと思います。
あとゴリラの由来を知っている方がいらっしゃれば、コメントして頂けると嬉しいです。