Go言語

Go 1.20で始める本格RESTful API構築ガイド

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


Contents

スポンサードリンク

1. 環境構築とプロジェクト初期化

1‑1. Go のインストール(最新版推奨)

公式サイト https://go.dev/dl/ から Go 1.20 系の最新パッチ を取得し、以下の手順で展開します。

Tip
macOS は Homebrew (brew install go@1.20) でも簡単にインストールできます。

1‑2. プロジェクトディレクトリと go.mod の作成

推奨ディレクトリ構造(Clean Architecture にヒント)

1‑3. 必要なライブラリを取得(バージョンは go.mod に任せる)

機能 推奨パッケージ 説明
ルーティング chi (github.com/go-chi/chi/v5) または gorilla/mux(どちらか一方) 本稿では chi を例に採用します。軽量でミドルウェアの組み込みがシンプルです。
MySQL ドライバ github.com/go-sql-driver/mysql 標準的な DB ドライバ
テスト用モック github.com/DATA-DOG/go-sqlmock SQL の振る舞いをインメモリで再現
アサーション github.com/stretchr/testify テストコードの可読性向上
バリデーション github.com/go-playground/validator/v10 struct タグベースのバリデータ

選択ガイド
chi は標準 net/http と同様のハンドラインターフェイスを保ちつつ、ミドルウェアチェーンがシンプルです。
gorilla/mux はパス変数や正規表現マッチングに強みがありますが、依存関係が若干重くなる傾向があります。プロジェクトの要件(高度な URL パターンが必要か)で選択してください。


2. API 実装とルーティング設計

2‑1. エントリポイント (cmd/server/main.go)

2‑2. ルーティング定義 (internal/api/router.go)

2‑3. データ構造体と JSON タグ (internal/model/user.go)

2‑4. ハンドラ実装 (internal/api/handler.go)

2‑5. バリデーションロジック (internal/service/validation.go)


3. データベース連携とテスト戦略

3‑1. DB 接続ラッパー (internal/repository/mysql.go)

3‑2. リポジトリインターフェイスと実装

3‑3. サービス層でリポジトリを利用

3‑4. ユニットテストのベストプラクティス

ハンドラ単体テスト (internal/api/handler_test.go)

リポジトリ層テスト(SQL モックだけで完結)

ポイント
依存性注入(DI)を利用すれば、テスト時にモック実装だけ差し替えられます。
go-sqlmock はクエリ文字列の正規表現マッチングが可能なので、SQL の書き方が変わってもテストを柔軟に保てます。


4. Lint 設定と CI/CD パイプライン

4‑1. golangci-lint のインストール(バージョンは「最新版」)

注意
固定バージョン(例:v1.57.2)は時間が経つと古くなるため、CI では latest タグや go.modtoolchain セクションで管理することを推奨します。

4‑2. .golangci.yml(公式推奨リストをベースにカスタマイズ)

4‑3. GitHub Actions による自動化 (.github/workflows/ci.yml)

ベストプラクティス
go test のカバレッジは Pull Request にコメントで自動報告すると、品質向上に役立ちます。
Linter とテストは同一ジョブで実行することで、CI 時間を短縮できます(ステップ間のキャッシュ共有)。


5. マルチステージ Docker と Cloud Run デプロイ

5‑1. Dockerfile(サイズ変動要因と目安)

イメージサイズに関する注意点

要因 影響例
ベースイメージ golang:1.20-alpine(≈ 200 MB)→ ビルドステージのみで削除すれば、最終イメージは 10 ~ 30 MB 程度になることが多い
静的リンク (CGO_ENABLED=0) musl 系のランタイムだけで動作でき、サイズが抑えられる
依存ライブラリの数 大量の C ライブラリや外部バイナリをインストールすると数十 MB 上乗せされる

結論
正確なサイズは docker build 後に docker images で確認してください。本文中の「数十 MB」はあくまで 目安 とし、実際のサイズはプロジェクト固有の依存関係に左右されます。

5‑2. ローカルビルド・テスト

ブラウザまたは curl http://localhost:8080/healthz200 OK を返せば成功です。

5‑3. Docker イメージの CI ビルド・プッシュ(GitHub Actions)

5‑4. Cloud Run へのデプロイ手順

  1. Google Cloud SDK のインストール(ローカルでテストしたい場合)

bash
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init

  1. イメージを Artifact Registry へプッシュ(GitHub Actions が自動実行)

  2. Cloud Run にデプロイ

bash
PROJECT_ID=your-gcp-project
REGION=us-central1
IMAGE=us-central1-docker.pkg.dev/$PROJECT_ID/myapi/myapi:latest

gcloud run deploy myapi \
--image $IMAGE \
--region $REGION \
--platform managed \
--allow-unauthenticated \
--set-env-vars DB_DSN="${DB_USER}:${DB_PASS}@tcp(${DB_HOST}:3306)/${DB_NAME}?parseTime=true"

シークレット管理(Secret Manager 推奨)

セキュリティポイント
環境変数に平文で認証情報を書かない。Secret Manager 経由で注入するのが安全です。
Cloud Run の IAM でアクセス権限を最小化し、不要な公開は避けましょう。


6. 補足:本番運用に向けた追加ベストプラクティス

項目 内容
ロギング log/slog(Go 1.21 以降)や zapzerolog を導入し、JSON ログで構造化。
メトリクス Prometheus 用エンドポイント (/metrics) と go-metrics ライブラリで CPU・GC 時間等を可視化。
ヘルスチェック Cloud Run のヘルスチェックは /healthz が 200 を返すだけで OK。必要なら DB 接続確認も追加。
Graceful Shutdown http.Server.Shutdown とシグナルハンドラで安全にプロセス終了。
依存関係の自動更新 Dependabot や Renovate Bot を有効化し、モジュールを常に最新に保つ。
コードレビューのチェックリスト Lint, テストカバレッジ ≥ 80%、脆弱性スキャン(go vet -tests, gosec) が必須かどうかを CI に組み込む。

7. まとめ

フェーズ 主なポイント
環境構築 Go 1.20 の最新版インストール → go.mod 初期化、ディレクトリ設計
ルーティング選択 chi(軽量・ミドルウェアが簡単)か gorilla/mux(高度なパスマッチ)を要件で判断し、一貫した実装に統一
API 実装 net/http + ルータ → JSON エンコード/デコード、バリデーション (validator/v10)、統一エラーレスポンス
DB & テスト MySQL ドライバ+リポジトリインターフェイス抽象化 → go-sqlmockhttptest で高速テスト
Lint & CI golangci-lint(最新版)と GitHub Actions による自動ビルド・テスト・Lint
Docker マルチステージ Docker で最終イメージは 10 ~ 30 MB の目安(実際は依存により変動)
デプロイ GitHub Actions → Artifact Registry → Cloud Run、Secret Manager で機密情報管理
運用拡張 ロギング・メトリクス・Graceful Shutdown・Dependabot による継続的改善

以上の手順とベストプラクティスを踏むことで、ローカル開発から本番環境への自動デプロイまで 一貫したフロー が実現できます。ぜひご自身のプロジェクトで試し、必要に応じてカスタマイズしてみてください!

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Go言語