【Go言語入門】Ginを使ったWeb API開発チュートリアル | 開発環境構築からCRUD操作まで

バックエンド

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.goimport文の下に、扱うデータ(ここでは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操作の実装方法を習得しました。

次のステップ:

  1. データ永続化: メモリ上のデータではなく、PostgreSQLやMySQLなどのデータベースに接続し、データを保存する仕組みを学ぶ。
  2. バリデーション: リクエストとして送られてきたデータが正しい形式かチェックする機能(バリデーション)を追加する。
  3. テストコード: 作成したAPIが正しく動作するか確認するための単体テストを実装する。

この強力な組み合わせをマスターして、あなたのGo開発スキルをさらに高めてください!

コメント

タイトルとURLをコピーしました