1. イントロダクション:なぜGoとGinなのか?
Go言語(Golang)は、その高い並行処理性能とメモリ効率から、特にバックエンドのAPIサーバーやマイクロサービスの開発で大きなシェアを獲得しています。
そして、GoのWebフレームワークの中でも、高速でミニマルなAPI構築に適しているのが Gin です。
- Goのメリット: 起動が速い、並行処理に強い、静的型付けで安全性が高い。
- Ginのメリット: 軽量で高速、ルーティングが簡単、ミドルウェア機能が豊富。
この記事では、Go言語の環境構築からGinを使ったシンプルなWeb APIを完成させるまでを解説します。
2. Step 1: 開発環境のセットアップ
2.1 Go言語のインストール
まず、Go言語の公式ページからOSに合わせたインストーラーをダウンロードし、インストールしてください。
インストール後、ターミナルで以下のコマンドを実行し、バージョンが表示されれば成功です。
Bash
go version
2.2 プロジェクトの初期化
開発用のディレクトリを作成し、Goモジュールとして初期化します。
Bash
# プロジェクトフォルダの作成
mkdir go-api-tutorial
cd go-api-tutorial
# Goモジュールとして初期化(モジュール名は任意のドメイン/プロジェクト名)
go mod init go-api-tutorial
2.3 Ginフレームワークの導入
Goモジュールを初期化したら、go getコマンドを使ってGinフレームワークを導入します。
Bash
go get github.com/gin-gonic/gin
3. Step 2: 最初のAPIサーバーを起動する
プロジェクトルートに main.go ファイルを作成し、Ginを使った最小構成のサーバーコードを記述します。
3.1 main.go の作成
Go
// main.go
package main
import "github.com/gin-gonic/gin"
func main() {
// Ginのデフォルトルーターを作成
r := gin.Default()
// GETリクエストに対するハンドラを定義
// パス: /hello
r.GET("/hello", func(c *gin.Context) {
// JSON形式でレスポンスを返す
c.JSON(200, gin.H{
"message": "Hello, Gin API!",
})
})
// サーバーを起動
// ポート番号: 8080
r.Run(":8080") // http://localhost:8080 でアクセス可能
}
3.2 サーバーの実行
以下のコマンドでサーバーを実行します。
Bash
go run main.go
ターミナルに Listening and serving HTTP on :8080 と表示されたら成功です。ブラウザまたは curl コマンドで http://localhost:8080/hello にアクセスし、JSONデータが返ってくることを確認してください。
4. Step 3: データの定義とCRUD操作の実装
実際にデータを操作するための基本的なAPIエンドポイント(CRUD)を実装します。ここでは、シンプルにメモリ上にデータを保持する形で進めます。
4.1 データの定義
main.goのimport文の下に、扱うデータ(ここではTodoリスト)の構造体と、データを格納するスライス(Goの配列のようなもの)を定義します。
Go
// ... import の下に追記 ...
// Todo構造体を定義
type Todo struct {
ID string `json:"id"` // JSONタグを付けてJSONとのマッピングを定義
Title string `json:"title"`
Status string `json:"status"`
}
// データ格納用のスライス(Goの動的配列)
var todos = []Todo{
{ID: "1", Title: "Go言語学習", Status: "完了"},
{ID: "2", Title: "API構築", Status: "進行中"},
}
4.2 CRUDエンドポイントの追加
main関数内のルーティング設定を以下のように更新し、4つの関数を追加します。
Go
func main() {
r := gin.Default()
// ルーティングの定義
r.GET("/todos", getTodos) // 全件取得 (Read All)
r.GET("/todos/:id", getTodoByID) // ID指定取得 (Read One)
r.POST("/todos", postTodo) // 新規作成 (Create)
r.PUT("/todos/:id", updateTodo) // 更新 (Update)
r.DELETE("/todos/:id", deleteTodo) // 削除 (Delete)
r.Run(":8080")
}
4.3 各ハンドラ関数の実装
① 全件取得(GET /todos)
Go
// 全てのTodoをJSONで返す
func getTodos(c *gin.Context) {
c.JSON(200, todos)
}
② 新規作成(POST /todos)
リクエストボディのJSONをTodo構造体にバインドし、スライスに追加します。
Go
// 新しいTodoをJSONリクエストから受け取り追加
func postTodo(c *gin.Context) {
var newTodo Todo
// リクエストボディのJSONをnewTodo構造体にバインド(紐付け)
if err := c.BindJSON(&newTodo); err != nil {
// バインドに失敗したら400エラーを返す
c.JSON(400, gin.H{"error": err.Error()})
return
}
// データをスライスに追加
todos = append(todos, newTodo)
// ステータス201 (Created) とともに新しいTodoを返す
c.JSON(201, newTodo)
}
③ ID指定取得(GET /todos/:id)
URLのパラメータからIDを取得し、一致するデータを検索します。
Go
// IDに基づいて単一のTodoを検索
func getTodoByID(c *gin.Context) {
// URLパスからIDを取得
id := c.Param("id")
// todosスライスをループしてIDを検索
for _, a := range todos {
if a.ID == id {
c.JSON(200, a) // 見つかったらJSONで返す
return
}
}
// 見つからなかったら404エラーを返す
c.JSON(404, gin.H{"message": "Todo not found"})
}
(※更新と削除のコードは長くなるため省略します。読者に自習してもらうか、別途記事を作成することを推奨します。)
5. まとめと次のステップ
この記事で、Go言語とGinフレームワークを使ったWeb APIの基本的なセットアップとCRUD操作の実装方法を習得しました。
次のステップ:
- データ永続化: メモリ上のデータではなく、PostgreSQLやMySQLなどのデータベースに接続し、データを保存する仕組みを学ぶ。
- バリデーション: リクエストとして送られてきたデータが正しい形式かチェックする機能(バリデーション)を追加する。
- テストコード: 作成したAPIが正しく動作するか確認するための単体テストを実装する。
この強力な組み合わせをマスターして、あなたのGo開発スキルをさらに高めてください!
コメント