Go言語初学者向けハンズオン:Todo APIを作成しよう
Go言語(Golang)は、そのシンプルさと高速な動作から、現代のバックエンド開発で非常に人気のある言語です。この記事では、Goの基本構文を学びつつ、実際に動作するTodo管理APIを構築します。
あえて外部フレームワーク(GinやEchoなど)を使わず、標準パッケージのみで実装することで、Goのコアな仕組みを理解することを目指します。
1. 開発環境の準備
まずは、プロジェクト用のディレクトリを作成し、Goモジュールを初期化します。
mkdir go-todo-api
cd go-todo-api
go mod init go-todo-api
これにより、go.modファイルが作成され、依存関係の管理ができるようになります。
2. データ構造の定義(Struct)
Todoアイテムを表現するための構造体(Struct)を定義します。main.goを作成し、以下のコードを記述しましょう。
package main
import (
"time"
)
// Todo はTodoアイテムの構造を定義します
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
CreatedAt time.Time `json:"created_at"`
}
// メモリ上にデータを保持するためのスライス
var todos []Todo
Goでは、構造体のフィールド名の後ろに記す json:"id" のようなタグを使って、JSONに変換する際のキー名を指定します。
3. ハンドラー関数の実装
APIのエンドポイントとなる関数を作成します。まずは「Todo一覧の取得」と「Todoの作成」を実装しましょう。
3.1 一覧取得(GET /todos)
func getTodos(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(todos)
}
3.2 新規作成(POST /todos)
JSONデコードを使って、リクエストボディからデータを読み取ります。
func createTodo(w http.ResponseWriter, r *http.Request) {
var newTodo Todo
if err := json.NewDecoder(r.Body).Decode(&newTodo); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
newTodo.ID = len(todos) + 1
newTodo.CreatedAt = time.Now()
todos = append(todos, newTodo)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(newTodo)
}
4. ルーティングとサーバーの起動
最後に、main関数の中でパスとハンドラーを紐付け、サーバーを起動させます。
package main
import (
"encoding/json"
"fmt"
"net/http"
)
func main() {
// ルーティングの設定
http.HandleFunc("/todos", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
getTodos(w, r)
case http.MethodPost:
createTodo(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
fmt.Println("Server starting at :8080...")
http.ListenAndServe(":8080", nil)
}
5. 動作確認
サーバーを起動して、curlコマンドやPostmanを使って動作を確認してみましょう。
サーバー起動:
go run main.go
データの作成(POST):
curl -X POST -d '{"title": "Goの勉強をする"}' http://localhost:8080/todos
データの一覧取得(GET):
curl http://localhost:8080/todos
6. まとめと次のステップ
今回はGoの標準パッケージのみを使って、基本的なAPIの形を作りました。このハンズオンを通じて、以下の概念に触れることができました。
- 構造体 (Struct) と JSONタグ
- スライス (Slice) によるデータ保持
net/httpパッケージによるサーバー構築jsonパッケージによるエンコード/デコード
次への課題:
- 特定のIDのTodoを「更新(PUT)」や「削除(DELETE)」する機能を実装してみましょう。
- 現在はメモリ上にデータを保存していますが、これをデータベース(SQLiteやPostgreSQL)に保存するように変更してみましょう。
Goの世界はここからが本番です。Happy Coding!
今回の工夫点
- ハンズオン形式: 読者が上から順に読み進めることで、自然にコードが完成するように構成しました。
- 標準パッケージへのこだわり: Goの哲学である「ミニマリズム」を感じられるよう、サードパーティ製ライブラリを使わない構成にしています。
- コードブロックの言語指定:
bashやgoを指定し、シンタックスハイライトが効くようにしています。
次は、これをデータベース(SQL)と連携させる「中級編」を作成しましょうか?それとも他の言語のハンズオンをご希望ですか?
コメント
コメントを読み込み中...
