はじめに
「Goのシンプルさは魅力的だが、エラーハンドリングのパターンに慣れない」
「goroutineとchannelの使い方がよくわからない」
「Goらしいコード(Idiomatic Go)の書き方を学びたい」
Goはシンプルな文法と高い並行処理性能で人気が高まっています。Claude Codeを使えば、Goらしいコードの書き方を学びながら、APIサーバー・CLIツール・マイクロサービスを効率的に実装できます。
目次
- Claude CodeとGo開発の相性
- プロジェクト構成の設計
- HTTPサーバーの実装(net/http・Chi・Gin)
- エラーハンドリングのパターン
- goroutineとchannelの活用
- データベースアクセス(sqlx・GORM)
- テストの実装
- まとめ
1. Claude CodeとGo開発の相性
Idiomatic Goのレビュー
> このGoコードをレビューして、Idiomatic Goに改善してください。
チェック観点:
- エラーハンドリングが適切か(エラーを無視していないか)
- インターフェースの適切な使用
- goroutineのリーク
- defer・panic・recoverの適切な使用
- パッケージ設計の適切さ
[コードを貼り付け]
Go Modulesの管理
> このGoプロジェクトのgo.modとgo.sumを最適化してください。
確認項目:
- 未使用の依存パッケージの削除(go mod tidy)
- 脆弱性のある依存パッケージの更新(govulncheck)
- 間接依存の整理
- Replace directiveの整理
2. プロジェクト構成の設計
Standard Go Project Layoutの適用
> このGoプロジェクトをStandard Go Project Layoutに再構成してください。
現在の構成:すべてmain.goに詰め込まれている
目標の構成:
cmd/api/main.go # エントリポイント
internal/ # 外部から使われないパッケージ
handler/ # HTTPハンドラー
service/ # ビジネスロジック
repository/ # データアクセス層
domain/ # ドメインモデル
pkg/ # 外部から使えるパッケージ
configs/ # 設定ファイル
各パッケージの責務と依存方向も説明してください。
3. HTTPサーバーの実装
net/httpによるシンプルなAPIサーバー
> net/http標準ライブラリでREST APIサーバーを実装してください。
エンドポイント:
- GET /api/v1/tasks
- POST /api/v1/tasks
- GET /api/v1/tasks/:id
- PUT /api/v1/tasks/:id
- DELETE /api/v1/tasks/:id
実装内容:
- ミドルウェア(ログ・認証・CORS・レートリミット)
- グレースフルシャットダウン
- contextを使ったリクエストスコープの管理
- 構造化ログ(slog標準ライブラリ)
Chiルーターを使った実装
> Chiルーターを使ってAPIサーバーをリファクタリングしてください。
追加する機能:
- URLパラメータの型安全な取得
- グループルーティング(/api/v1/)
- ミドルウェアチェーンの整理
- OpenAPI仕様の自動生成(swaggo)
4. エラーハンドリングのパターン
Goらしいエラーハンドリング
> このコードのエラーハンドリングをGoのベストプラクティスに改善してください。
改善内容:
- エラーの無視箇所を特定して対処
- errors.Is・errors.Asを使ったエラー比較
- カスタムエラー型の定義
- エラーへのコンテキスト情報の付加(fmt.Errorf with %w)
- sentinelエラーの定義
[コードを貼り付け]
構造化エラーハンドリング
> このAPIのエラーレスポンスを統一してください。
エラー型の設計:
- AppError構造体(コード・メッセージ・詳細・HTTPステータス)
- ドメインエラーとインフラエラーの分離
- HTTPハンドラーでの統一変換
pkg/errors/以下に実装してください。
5. goroutineとchannelの活用
並行処理の実装
> 以下の処理をgoroutineを使って並行化してください。
現在:10個のAPIエンドポイントに順次リクエスト(約30秒)
目標:並行リクエストで5秒以内に完了
考慮すること:
- 最大並行数の制限(semaphoreパターン)
- エラーが発生した場合の処理
- タイムアウトの設定(context.WithTimeout)
- すべての結果の収集(errgroup使用)
[現在のコードを貼り付け]
Pipelineパターンの実装
> CSVファイルを並行処理するPipelineを実装してください。
パイプライン構成:
1. ファイル読み込み(ステージ1)
2. データのパース・バリデーション(ステージ2・並行)
3. データベースへの保存(ステージ3)
4. 結果レポートの生成(ステージ4)
各ステージをchannelで接続して、
コンテキストキャンセルに対応してください。
6. データベースアクセス
sqlxを使ったデータアクセス層
> sqlxを使ったリポジトリパターンを実装してください。
要件:
- インターフェースによる抽象化(テスト用モック作成のため)
- トランザクションの適切な管理
- Named queriesによる安全なクエリ構築
- 接続プーリングの設定
repositoryのインターフェースとsqlx実装を分けてください。
testcontainersを使った統合テストも作成してください。
7. テストの実装
テーブル駆動テスト
> このGoコードのテストをテーブル駆動テストで作成してください。
テストのポイント:
- テストケースをtests slice で定義
- t.Run()でサブテストとして実行
- テストヘルパーの共通化
- HTTPハンドラーのテスト(httptest.NewRecorder使用)
- モックの生成(mockery使用)
[対象のコードを貼り付け]
8. まとめ
Claude CodeでのGo開発の効率化ポイント:
- Idiomatic Goのコードレビューと改善を自動化
- goroutine・channelの並行処理設計を相談できる
- エラーハンドリングパターンを正確に実装できる
- テーブル駆動テストを自動生成できる
Goらしいコードを書くためのポイント:
- エラーを無視しない
- インターフェースは使う側が定義する
- 小さなパッケージに分割する
- goroutineは必ずリーク検知を考慮する
次回の第44回:Kubernetesを運用する方法では、マニフェスト作成からトラブルシューティングまでを解説します。
よくある質問(FAQ)
Q. GinとEchoとChiのどれを使えばいいですか?
A. Claude Codeに「このプロジェクトに最適なGoのWebフレームワークを提案してください」と相談することで、規模・要件・チームの習熟度に応じた推奨を得られます。シンプルなAPIなら標準ライブラリのnet/httpも有力な選択肢です。
この記事はClaude Code入門シリーズ(第5部)の第43回です。← 第42回:Rust入門 | 第44回:Kubernetes →
ご質問はお問い合わせページからお気軽にどうぞ。