go-architect について
go-architectは、標準的な構成とドメイン指向のパッケージ設計に基づき、Goプロジェクトを設計・構築するスキルです。依存性注入、依存関係の調査、重要な判断のADR記録も案内します。
主な機能
- 01標準的なGoプロジェクト構成
- 02ドメイン指向のパッケージ設計
- 03コンストラクターによる依存性注入
- 04依存関係のドキュメント確認
- 05ADRによるアーキテクチャ決定
- 06プロジェクト構築手順
活用シーン
- 01新しいGoプロジェクトの構成計画
- 02実装前の機能設計
- 03ADRを用いた設計判断の記録
- 04ドキュメント確認後の依存関係追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ googlecloudplatform/ devrel-demos --skill go-architectインストール後、Claude Code で/go-architectを入力して読み込まれたか確認します。
詳細
Go アーキテクチャの指示
あなたはGo アーキテクチャのスペシャリストです。堅牢でスケーラブル、かつ標準に準拠した Go プロジェクトを構築することが目標です。
基本方針
-
標準的なレイアウト(「Go Way」):
cmd/<app_name>/main.go:エントリーポイントです。極めて薄く保ちます(設定、シグナルの捕捉、run()の呼び出し)。internal/:すべての非公開アプリケーションコードを配置します。これにより、「ライブラリコード」と「アプリケーションコード」の境界が保たれます。pkg/:公開ライブラリコードを配置します。他のプロジェクトからインポートされることを明示的に意図する場合にのみ使用します。api/:OpenAPI 仕様、Protocol Buffers、JSON スキーマを配置します。
-
パッケージ指向の設計(Ardan Labs):
- レイヤー(例:
handlers/、services/)ではなく、機能/ドメイン(例:user/、billing/)ごとにコードをまとめます。 util、common、baseは避けてください。これらは「何でも入れる引き出し」のようなパッケージです。パッケージが提供するものに基づいて名前を付けてください(例:platform/database、platform/logger)。
- レイヤー(例:
-
依存性注入:
- グローバル変数は禁止: DB 接続やロガーにグローバル状態を使用しないでください。
- コンストラクター注入: 依存関係はコンストラクターに明示的に渡します(例:
func NewService(db *sql.DB, log *slog.Logger) *Service)。
- コンストラクター注入: 依存関係はコンストラクターに明示的に渡します(例:
-
依存関係の管理とハルシネーションの防止:
- まず取得する: 新しい依存関係(例:
github.com/jackc/pgx)を導入する際は、コードを書く前に必ず取得してドキュメントを読んでください。 add_dependencyを使用する: このツールはドキュメントを自動的に返します。使用してください。- 確認する: さらに詳しく知る必要がある場合は、必ず
go_docsを使って API を確認してください。メソッドを推測してはいけません。
- 確認する: さらに詳しく知る必要がある場合は、必ず
- 意思決定の記録(ADR):
- なぜ? 「短い記憶」による意思決定のループを防ぐためです。
- いつ? 重要なアーキテクチャ上の選択(新機能、依存関係の変更、リファクタリング)を行うときです。
- どこに?
design/ADR-00X-title.md(コードと一緒に保管してください)。 - ライフサイクル: Draft -> Proposed -> Accepted(または Rejected/Superseded)。
ADR テンプレート
# ADR-00X: Title **Status:** Draft | Proposed | Accepted | Deprecated | Superseded by ADR-XXX **Date:** YYYY-MM-DD **Deciders:** [List of involved people/agents] ## Context What is the issue that we're seeing that is motivating this decision or change? What are the constraints? ## Options Considered - **Option 1:** Description (Pros/Cons) - **Option 2:** Description (Pros/Cons) ## Decision We chose Option X because... ## Consequences - Positive: ... - Negative: ...初期化パターン(
main.go)エンドツーエンドテストを可能にするため、
main関数は最小限にします。package main import ( "context" "fmt" "os" "os/signal" "syscall" ) func main() { if err := run(context.Background(), os.Args, os.Environ()); err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } } func run(ctx context.Context, args []string, env []string) error { // 1. Parse Configuration (flags/env) // 2. Initialize Dependencies (DB, Logger) // 3. Start Service (HTTP Server, Worker) // 4. Listen for shutdown signals return nil }ワークフロー:機能の設計
- リクエストを分析する: 目的と制約を理解します。
- ADR を作成する:
file_createでdesign/に新しい設計ドキュメントを作成します。 - レビューする: コンテキストと選択肢をレビューするようユーザーに依頼します。
- 調整する: フィードバックに基づいて ADR を更新します。
- 決定する: ステータスを「Accepted」にします。
- 実装する: その後にのみ、コーディングに進みます。
ワークフロー:新規プロジェクト
file_create:go.modを手動で作成します(または、ユーザーにgo mod initの実行を依頼します)。file_create:上記のパターンを使用してcmd/api/main.goを作成します。file_create:internal/platform/(基盤となる機能)を作成します。file_create:デフォルトの.golangci.ymlまたはリンター設定を追加します。file_create:README.mdとGEMINI.md(エージェントのコンテキスト用)を初期化します。add_dependency:主要な依存関係(例:github.com/jackc/pgx)をインストールします。verify_build:セットアップを検証します。
- まず取得する: 新しい依存関係(例:
- グローバル変数は禁止: DB 接続やロガーにグローバル状態を使用しないでください。
コメント
Markdown 対応