Goのインターフェース実装パターン
Goでは、インターフェースで定義されたメソッドを全て実装した構造体は、そのインターフェースを暗黙的に実装したと見なされます。以下は簡単な例です。
type Human interface { Greet() error }
type Samurai struct {}
func (s Samurai) Greet() error { return nil }
Samurai
はGreet
メソッドを実装しているため、Human
インターフェースを実装しています。
プロジェクトの検証
1. ドメイン層でのインターフェース定義
domain/account.go
でAccountRepository
インターフェースが定義されています。
type AccountRepository interface {
Create(ctx context.Context, account Account) (Account, error)
UpdateBalance(ctx context.Context, id AccountID, balance Money) error
FindAll(ctx context.Context) ([]Account, error)
FindByID(ctx context.Context, id AccountID) (Account, error)
FindBalance(ctx context.Context, id AccountID) (Account, error)
}
2. アダプタ層での実装
repository/account_mongodb.go
でAccountNoSQL
構造体がAccountRepository
を実装しています。
type AccountNoSQL struct { db NoSQL }
func (a AccountNoSQL) Create(ctx context.Context, account domain.Account) (domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) UpdateBalance(ctx context.Context, id domain.AccountID, balance domain.Money) error { /* 実装 */ }
func (a AccountNoSQL) FindAll(ctx context.Context) ([]domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) FindByID(ctx context.Context, id domain.AccountID) (domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) FindBalance(ctx context.Context, id domain.AccountID) (domain.Account, error) { /* 実装 */ }
AccountNoSQL
はAccountRepository
の全メソッドを実装しているため、インターフェースを正しく実装しています。
結論
AccountRepository
の実装はアダプタ層のAccountNoSQL
で行われており、図解は正しいです。
参考記事