• ソフトウェア開発では、ある部分を変更しても他の部分に影響が及ばないように、コードの「デカップリング(分離)に留意する必要がある
  • デカップリングを実現するための一つの手法に依存性注入(dependency injection)がある
  • Goでは明示的なインタフェース実装を行わず、暗黙的に依存性注入を行うことができる
// インタフェース定義
type Logger interface {
    Log(message string)
}
 
type DataStore interface {
    UserNameForID(userID string) (string, bool)
}
 
// 型や構造体を定義
type LoggerAdapter func(message string)
 
type SimpleDataStore struct {
    userData map[string]string
}
 
// 関数型や構造体がインタフェースメソッドを実装することで、暗黙的にインタフェースを満たす
func (lg LoggerAdapter) Log(message string) {
    lg(message)
}
 
func (sds SimpleDataStore) UserNameForID(userID string) (string, bool) {
		name, ok := sds.userData[userID]
		return name, ok
}
 
// 依存する機能(Logger / DataStore)をインタフェース経由で注入することで、柔軟でテスト可能な設計となる
type SimpleLogic struct {
		l  Logger
		ds DataStore
}
 
func NewSimpleLogic(l Logger, ds DataStore) SimpleLogic {
		return SimpleLogic{
		l:  l,
		ds: ds,
	}
}