🎉
Golang インターフェース
インターフェース
基本
- 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 関数を変更する必要がない
コードの柔軟性が向上し、拡張が簡単になっている
Discussion