以前、本連載ではGoの標準機能だけで掲示板を作る方法を紹介しました。しかし、専用のフレームワークを使うと、より簡単にさまざまな機能が利用できます。今回は、Go言語で最も人気があるWebフレームワークGinを使って簡単なWebアプリを作る方法を紹介します。

  • Go言語とGinを使うと手軽にアプリが開発できる

    Go言語とGinを使うと手軽にアプリが開発できる

Webフレームワーク「Gin」について

Webアプリケーションの開発では、何度も似たような処理を実装する場面があります。そこで、似たような処理をまとめて開発を簡易化するためのライブラリ一式を「Webフレームワーク」と呼びます。そもそもフレームワークとは「骨組み」という意味があります。つまり、Webアプリケーションの土台となる枠組みを提供するものです。

各プログラミング言語ごとに、その言語の特色を反映したフレームワークがありますが、Go言語にも、Gin、Beego、Martini、Echoなどいろいろなものがあります。

その中も最も人気があるのが「Gin」です。Ginは比較的軽量で実行速度も速く扱い易いのが特徴です。日本語のドキュメントも整備されています。GinのWebサイトトップページには「フル機能の最速Webフレームワーク」「水晶のようにクリア」と記載されています。

Ginを使い始めるための準備

それでは、さっそくGinを使うための準備をしましょう。Goの最新安定版である1.17を利用することとします。コマンドラインで以下のコマンドを実行すると、バージョンを確認できます。

$ go version
go version go1.17 ...

多少バージョンが古くても動くと思いますが、バージョンが古い場合は、こちらより最新番をダウンロードしてインストールしてください。

Ginをインストールするには、コマンドライン(WindowsならPowerShell、macOSならターミナル.app)からコマンドを実行します。また、go modを使ってモジュールの管理をしつつ使ってみましょう。

go modでプロジェクトを初期化するには、以下のコマンドを実行します。

# プロジェクトのフォルダを作成
$ mkdir hello_gin && cd hello_gin
# go modを初期化
$ go mod init hello_gin

そして、Ginをインストールしましょう。「go get」を実行することで、Goのパッケージを手軽にインストールできます。以下のコマンドを実行すると、Ginのv1.7.4をインストールします。

$ go get github.com/gin-gonic/gin@v1.7.4

以上で準備は完了です。

一番簡単なWebアプリを実行してみよう

画面に「Hello, World!」と表示するだけのWebアプリを作ってみましょう。ファイル「main.go」に以下のように記述します。

package main
import (
  "log"
  "github.com/gin-gonic/gin"
)
func main() {
  // ルーターを準備 --- (*1)
  router := gin.Default()
  // URIとハンドラを指定 --- (*2)
  router.GET("/", func(ctx *gin.Context) {
    ctx.String(200, "Hello, World!")
  })
  // サーバーを起動 --- (*3)
  err := router.Run("127.0.0.1:8888")
  if err != nil {
    log.Fatal("サーバー起動に失敗", err)
  }
}

それでは、プログラムを実行してみましょう。以下のコマンドを実行します。

$ go run .

するとGinのHTTPサーバーが起動します。そこで、Webブラウザのアドレスバーに「http://127.0.0.1:8888」と入力しましょう。ブラウザの画面には以下のように表示されます。

  • ブラウザでアクセスしたとき

    ブラウザでアクセスしたとき

プログラムを確認してみましょう。GinのWebアプリでは、どのアドレス(URI)にアクセスがあったときに何を返すのかを指定することで成り立ちます。アドレスと機能を管理するのが(*1)のrouterです。

(*2)ではサーバーのルート「/」にアクセスしたときに、Hello, World!と表示するハンドラ( 関数)を指定します。

そして、(*3)の部分でサーバーを起動します。ここでは「127.0.0.1:8888」のアドレスでサーバーを起動します。127.0.0.1というのは、サーバーを起動したPC自身のアドレスで、8888というのがポート番号を表しています。

HTMLと連携して挨拶するアプリを作ろう

次に、Ginの各種機能を利用する方法を確認してみましょう。その例として、静的ファイルの扱いや、HTMLのフォームを処理するする方法などを確認してみましょう。ここでは、名前を入力すると、その名前を利用して挨拶するWebアプリを作ってみましょう。

なお、ApacheなどのWebサーバーでは、サーバーを起動すると、指定したフォルダ以下のHTMLや画像などのファイルを自動的にブラウザに返します。Ginにもこの機能を利用できます。

ここでは、プログラムと同じフォルダにstaticというフォルダを作り、そのフォルダ以下に、index.htmlというファイルを配置してみましょう。以下のような構造にしてみます。先ほど作ったhello_ginプロジェクトをそのまま利用することにしましょう。

.
├── go.mod
├── main.go
└── <static>
    └── index.html

なお、ファイル「static/index.html」には、以下のように、名前を入力して送信するフォームを記述しました。

<!DOCTYPE html>
<html><meta charset="utf-8"><body>
    <h1>名前を入力してください</h1>
    <form action="/hello" method="GET">
      <input type="text" name="name" value="クジラ">
      <input type="submit" value="送信">
    </form>
</body></html>

続いて、main.goには以下のように記述します。

package main
import (
  "log"
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  router := gin.Default()

  // 自動的にファイルを返すよう設定 --- (*1)
  router.StaticFS("/static", http.Dir("static"))

  // ルートなら /static/index.html にリダイレクト --- (*2)
  router.GET("/", func(ctx *gin.Context) {
    ctx.Redirect(302, "/static/index.html")
  })

  // フォームの内容を受け取って挨拶する --- (*3)
  router.GET("/hello", func(ctx *gin.Context) {
    name := ctx.Query("name")
    ctx.Header("Content-Type", "text/html; charset=UTF-8")
    ctx.String(200, "<h1>Hello, " + name + "</h1>")
  })

  // サーバーを起動
  err := router.Run("127.0.0.1:8888")
  if err != nil {
    log.Fatal("サーバー起動に失敗", err)
  }
}

上記ファイルを用意したら、コマンドラインから以下のコマンドを実行しましょう。すると、サーバーが起動します。

$ go run .

そして、Webブラウザを起動して、先ほどと同じ「127.0.0.1:8888」をアドレスバーに入力してみましょう。名前の入力フォームが表示されるので、名前を入力して送信すると、その名前を利用して「Hello, (名前)」のように表示します。

  • Webアプリを実行したところ

    Webアプリを実行したところ

プログラムを確認してみましょう。(*1)の部分では、staticフォルダ以下にあるファイルを自動的にブラウザに返信するように指定します。

(*2)の部分では、サーバーのルートにアクセスがあったとき、「/static/index.html」にリダイレクトして、HTMLファイルが表示されるように指定します。

そして、(*3)では、static/index.htmlの入力フォームに名前を入力して「送信」ボタンを押した時に、挨拶を表示するプログラムを記述します。ここでは、動的にHTMLのコードを生成して返信します。

Ginのまとめ

以上、今回は簡単にGinを利用してWebアプリを開発する方法を紹介しました。今回は、簡単に応答を返すだけのプログラムを作りました。他のプログラミング言語で、Webアプリを作ったことがある人であれば、迷うことなくGo言語とGinを利用してWebアプリを作ることができるでしょう。もちろん、親切な日本語ドキュメントも用意されているので、ドキュメントやサンプルアプリを見ながら、Webアプリ開発に慣れていくこともできるでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。