Go 言語で使える Web フレームワーク "Gin" を始める

Gin とは?

Go 言語で使える Http Web フレームワーク。

“Martini” のような API が特徴ですが、 Martini の 40 倍以上の速さがあります。

とにかく速度が要求されるのであれば、Gin がおすすめです。

特徴

速い

  • Radix Tree に基づいたルーティング機構
  • メモリ消費量が少ない
  • リフレクションを使わない
  • API 性能が予測しやすい

ミドルウェア

クライアントからのリクエストは、ミドルウェアのチェイン ( フィルタ ) を多段的に経由して、最終的にアクションによって処理されます。

ミドルウェアには以下のようなものがあります。

  • ロギング
  • 認証・認可
  • GZIP による圧縮

クラッシュフリー

Gin は Http リクエストに対する処理中に発生した panic を捉えて、自動的に復旧します。

サーバーは特定のアクションの処理失敗によってダウンするようなことなく稼働し続けます。

例えば、 panic 発生を Sentry のようなサービスに通知できます。

JSON 検証

Gin はリクエストとして受け取った JSON のフォーマットが正しいかを検証してくれます。

フォーマットだけでなく、JSON 内の必須属性の値がセットされているかといったこともチェック可能です。

ルーティンググループ

ルーティングをグルーピングして管理できます。

  • 認証必須のパス と 認証不要なパス
  • API v1 バージョンのパス と API v2 バージョンのパス

グルーピングしたルーティングパスの階層に限界はなく、性能影響もありません。

エラー管理

Gin は HTTP リクエストで発生したエラーをすべて収集するための便利機能を用意してくれます。 最終的には、ミドルウェアによってエラーは以下のようなリソースに書き出されます。

  • ログファイル
  • データベース
  • その他ネットワーク経由で外部サービス

レンダリング

JSON だけでなく、XML、HTML などにレンダリングする機能を提供します。

拡張性

リクエストチェインの実態となる「ミドルウェア」は簡単に作成できますし、サンプルコードも用意されています。

クイックスタート

前提条件

以下のものがインストールされていることが前提となります。

  • Go 1.13 以上

インストール

事前に Go のプロジェクトが作成されている必要があります。

作業用ディレクトリに go.mod ファイルが無ければ、作成しておきます。

1
2
# my_gin_appの部分は任意のプロジェクト名
$ go mod init my_gin_app

準備ができたら、以下のコマンドを実行して Gin モジュールをインストールします。

1
$ go get -u github.com/gin-gonic/gin

カレントディレクトリに main.go を作成し、最初のコードを記述します。


手っ取り早く、公開されているテンプレートコードを拝借します。

1
$ curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go

"github.com/gin-gonic/gin" というパッケージがインポートされているはずです。

後はこの Go コードを実行するだけです。

1
2
3
# ファイルを指定しても、ディレクトリを指定してもどちらでも実行可能
# go run main.go
$ go run .

ブラウザでアクセスしてもいいですが、コマンドラインから curl でアクセスしてみます。

1
2
$ curl http://localhost:8080/ping
pong

レスポンスとして JSON を返却する

今度はレスポンスとして JSON を返却させてみます。 空のmain.go ファイルを作成します。

1
2
# すでに存在している場合には上書きされます
$ echo -n > main.go

main.go に以下のコードを記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

実行します。

1
2
3
# ファイルを指定しても、ディレクトリを指定してもどちらでも実行可能
# go run main.go
$ go run .

ブラウザでアクセスしてもいいですが、コマンドラインから curl でアクセスしてみます。

1
2
$ curl http://localhost:8080/ping
{"message":"pong"}

先ほどと少し異なり、JSON が出力されました。

ひとこと

Gin を使って本当にシンプルな Web アプリケーション ( と呼んでいいのかどうかも怪しいレベルのもの ) を作ることはできました。

次回は JWT を使った認証の仕組みを作って見たいと思います。


参考ページ