Ginとは

概要

Gin は、 Go 言語 の Web フレームワークです。
Go 言語 をそのまま使うより遥かに効率的に Web アプリケーション を作成することができます。

また高性能であり、 HttpRouter がバンドルされており最大 40 倍速のパフォーマンスを提供します。その思想は同様な Go フレームワーク である Martini から影響を受けており強力な API を備えています。

Gin を使用することで、Web アプリケーションの開発を マイクロサービス 、単純な API サーバー の開発など多岐にわたるプロダクトニーズにこたえることが可能です。
さらに、それをサポートするルーティング機能、ミドルウェアサポート、レンダリング機能など様々な機能の恩恵を受けることができます。

プレーン な Go 言語 と比較

通常の Web アプリケーション開発を行う上でフレームワークは欠かせない存在となっており、Go においてもプレーンで使うことはお勧めしません。

プレーンに拘るならば、それ相応の覚悟と学習コストを要すことは必須です。
以下コードを見てください。

またあらかじめバンドルされている機能を選定なしで使うことができるのも Gin を使うメリットの一つです。

プレーン Go

func Index(w http.ResponseWriter, r *http.Request, _httprouter.Params) {
  fmt.Fprint(w, "Welcome!\n")
}
http.HandleFunc("/users/", Index)

Gin

func(c *gin.Context) {
  c.JSON(200, gin.H{ "message": "Welcome"})
})
router.GET("/", Index)

簡単な Get リクエストを送信する場合を考えただけでも、フレームワークを使うだけで直感的でシンプルに書くことができます。

そしてこれは一部の機能です。他に記述量が増えてくるとプレーン Go ではさらに見通しが悪くなることでしょう。

ルーティング

Gin には、ルーティング制御を簡単にする API メソッドが備わっており、プレーン Go は違い直感的に扱うことが可能です。

func main() {
  // Creates a gin router with default middleware:
  // logger and recovery (crash-free) middleware
  router := gin.Default()
  router.GET("/someGet", getting)
  router.POST("/somePost", posting)
  router.PUT("/somePut", putting)
  router.DELETE("/someDelete", deleting)
  router.PATCH("/somePatch", patching)
  router.HEAD("/someHead", head)
  router.OPTIONS("/someOptions", options)
  // By default it serves on :8080 unless a
  // PORT environment variable was defined.
  router.Run()
  // router.Run(":3000") for a hard coded port
}

Express.js など触ったことがある人は見た瞬間に、理解できるはずです。

このわかりやすさも Gin を使うメリットになります。

ミドルウェア

Gin はミドルウェアを呼ばれる機能も備わっています。
この機能は API が実行された場合その前後で、起動することが保証されます。

その特徴から Session や Cookie の管理、アクセスロガーなどの機能を実装するとき重宝します。

func main() {
// Creates a router without any middleware by default
  r := gin.New()
  // Global middleware
  // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN\_MODE=release.
  // By default gin.DefaultWriter = os.Stdout
  r.Use(gin.Logger())

  // Recovery middleware recovers from any panics and writes a 500 if there was one.
  r.Use(gin.Recovery())

  // Per route middleware, you can add as many as you desire.
  r.GET("/benchmark", MyBenchLogger(), benchEndpoint)

  // Authorization group
  // authorized := r.Group("/", AuthRequired())
  // exactly the same as:
  authorized := r.Group("/")
  // per group middleware! in this case we use the custom created
  // AuthRequired() middleware just in the "authorized" group.
  authorized.Use(AuthRequired()) {
    authorized.POST("/login", loginEndpoint)
    authorized.POST("/submit", submitEndpoint)
    authorized.POST("/read", readEndpoint)
    // nested group
    testing := authorized.Group("testing")
    testing.GET("/analytics", analyticsEndpoint)
  }
  // Listen and serve on 0.0.0.0:8080
  r.Run(":8080")
}

まとめ

今回ざっくり説明しましたが他にも強力な機能が備わっており、Web アプリケーション開発をサポートしてくれます。

また利用者が多いので、ドキュメントや技術ブログが多いのもメリットです。

Go をプレーンで使ってきた人や、どのフレームワークを使うか悩んでいる人も触ってみる価値はあるかと思います。