標準Goプロジェクト構成
Standard Go Project Layout
Go実践において、プロジェクト構成はコードの可読性と保守性を左右します。Standard Go Project Layoutは、公式ドキュメントで推奨されるディレクトリ構成で、cmd、pkg、internal を中心に整理されます。これにより、ビルド対象とライブラリの境界が明確になり、依存関係の管理が容易になります。
典型的な構成例は以下の通りです。
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 のディレクトリ構成に落とし込むと、以下のようなレイヤーを意識します。
- エンティティ(Domain) –
internal/domain - ユースケース(Use Cases) –
internal/usecase - インターフェース(Interface Adapters) –
internal/adapter - フレームワーク&ドライバ(Frameworks & Drivers) –
cmdやpkgで実装
例えば、ユーザー登録機能を実装する場合、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 の標準的なディレクトリ構成とクリーンアーキテクチャを組み合わせることで、スケーラブルで保守性の高いシステムを構築できます。
コメント
コメントを投稿