スキップしてメイン コンテンツに移動

標準Goプロジェクト構成

標準Goプロジェクト構成

Standard Go Project Layout

Go実践において、プロジェクト構成はコードの可読性と保守性を左右します。Standard Go Project Layoutは、公式ドキュメントで推奨されるディレクトリ構成で、cmdpkginternal を中心に整理されます。これにより、ビルド対象とライブラリの境界が明確になり、依存関係の管理が容易になります。

典型的な構成例は以下の通りです。

myapp/
├── cmd/
│   └── myapp/
│       └── main.go
├── pkg/
│   └── util/
│       └── util.go
├── internal/
│   └── service/
│       └── service.go
├── go.mod
└── README.md

この構成では、cmd は実行可能バイナリを、pkg は外部に公開したいライブラリを、internal はプロジェクト内部でのみ使用するコードを格納します。

cmd, pkg, internal の役割

それぞれのディレクトリは明確な責務を持ちます。

  • cmd:アプリケーションのエントリポイント。複数のバイナリを持つ場合はサブディレクトリを作成。
  • pkg:再利用可能なパッケージ。外部モジュールとしてインポート可能。
  • internal:プロジェクト内部でのみ使用するパッケージ。外部からのインポートを禁止することで、実装の隠蔽を強化。

この分離により、テストの設計もシンプルになります。internal 内のコードはテストパッケージからもアクセスできるため、ユニットテストが容易です。

クリーンアーキテクチャとディレクトリ構成

クリーンアーキテクチャは、依存関係を「内側から外側へ」向ける設計思想です。Go のディレクトリ構成に落とし込むと、以下のようなレイヤーを意識します。

  1. エンティティ(Domain) – internal/domain
  2. ユースケース(Use Cases) – internal/usecase
  3. インターフェース(Interface Adapters) – internal/adapter
  4. フレームワーク&ドライバ(Frameworks & Drivers) – cmdpkg で実装

例えば、ユーザー登録機能を実装する場合、internal/domain/user.go にエンティティを定義し、internal/usecase/user.go にビジネスロジックを置きます。internal/adapter/repository.go でインターフェースを実装し、cmd/myapp/main.go で依存性注入を行います。

この構成は、テスト容易性とモジュール性を高め、将来的な拡張や変更に強いコードベースを構築します。

ベストプラクティスと整理

Go実践における整理のポイントは以下の通りです。

  • go.mod の管理:モジュール名はリポジトリURLに合わせ、replace を使ってローカル開発をスムーズに。
  • ドキュメント化README.md だけでなく、パッケージレベルで doc.go を作成し、godoc で閲覧可能に。
  • テストの分離*_test.go は同じディレクトリに置き、テストパッケージを package xxx_test として外部視点でテスト。
  • CI/CD の統合Makefile でビルド・テスト・lint を一括実行し、GitHub Actions で自動化。
  • コードレビューのルール化:Pull Request で必須チェックを設定し、品質を保つ。

これらを実践することで、プロジェクトは「整理された」状態を保ち、チーム全体での開発効率が向上します。Go の標準的なディレクトリ構成とクリーンアーキテクチャを組み合わせることで、スケーラブルで保守性の高いシステムを構築できます。

この記事はAIによって作成されました。

コメント