🎉

Golang インターフェース

2021/08/06に公開

インターフェース

基本

  • Goのインターフェースは明示的でははない、暗黙的である
  • Goではインターフェースを実装する為のキーワードがない

インターフェースの定義

type Duck interface {
	Display()
	Fly()
}
  • インターフェースには実装の詳細を含まない
  • インターフェースを実装する型にはインターフェースの全てのメソッドが必要となる

インターフェースの実装

  • Goでは型にインターフェイスで必要なメソッドがすべて含まれている場合、暗黙的にインターフェースが実装されていると判断される
  • 同じメソッド名をもつ、異なるインターフェースの場合、実行時に使用される際に把握される
type MallardDuck struct {}

func (d MallardDuck) Display() {
	fmt.Println("本物のマガモです")
}
func (d MallardDuck) Fly() {
	fmt.Println("飛んでいます")
}

インターフェースが役立つ例

インターフェースを実装した型を追加

type ModelDuck struct {}

func (d ModelDuck) Display() {
	fmt.Println("模型の鴨です")
}
func (d ModelDuck) Fly() {
	fmt.Println("飛べません")
}

インターフェースを引数にした関数

func performDuck(d Duck) {
	d.Display()
	d.Fly()
}

実行

func main(){
	var mallardDuck Duck = MallardDuck{}
	performDuck(mallardDuck)

	modelDuck := ModelDuck{}
	performDuck(modelDuck)
}

実行結果

本物のマガモです
飛んでいます
模型の鴨です
飛べません

Duckの新しい型ごとにperformDuck 関数を変更する必要がない
コードの柔軟性が向上し、拡張が簡単になっている

GitHubで編集を提案

Discussion