インターフェース
インターフェイスは、実装と使用を分離することが出来る。
また、Go言語のインターフェースは「循環参照」を解決するためにも使われる。
循環参照
Go言語ではパッケージの循環参照が禁止されている。
循環参照というのは、パッケージAとBがお互いに参照しあってるということ。
循環参照の禁止は、レイヤードアーキテクチャを実現することに寄与する。
しかし、時に、循環参照の禁止は厳しすぎる制約となり、プログラム作成の障害となってしまう。
そこで、インターフェースを用いてパッケージを循環参照から切り離し、循環参照可能な仕組みを作ることもある。
ファイル構造
dog/
Dog.go
DogLoar.go
cat/
Cat.go
DogInterface.go
main.go
ポイント
Dog.go
func (d *Dog) GetDog() string {
cat := &cat.Cat{ CatObj: NewDogRoar() }
// GetCat -> DogInterface -> GetDogRoar
return cat.GetCat()
}
※ GetDog関数の中でGetCat関数を呼び出しているが、結果は「Bow Wow !」になる。
出力例
/Go_Interface $ go build
/Go_Interface $ ./Go_Interface
Bow Wow !
GitHub