Go言語

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

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

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


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 による継続的改善

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

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Go言語