Goのinterface
Goで単体試験などをしたくなった場合、テスト対象となる機能が呼び出す関数を外から渡したくなる。 そんなときはinterfaceを使うことで実現できる。
こんな感じ
package main import "fmt" // インタフェースとして、どんな関数を具備している必要があるかを定義。 type Speaker interface { Greeting() } // そのインタフェースで定義された関数を使う関数を定義 // 単体テストのことを想定しているならば、これがテスト対象 func Run(i Speaker) { i.Greeting() } // インタフェースを持たせる構造体を定義 type Japanese struct { } // インタフェースに合うように、インタフェースで定義されている // 関数を構造体に対して実装 func (p *Japanese)Greeting() { fmt.Println("こんにちは") } // もうひとつ、同じインタフェースを持たせる別の構造体を定義しておいて、 type American struct { } // 先ほどと同じく、インタフェースに合うように、インタフェースで定義されている // 関数を構造体に対して実装 func (a *American)Greeting() { fmt.Println("Hi!") } // 使ってみる func main() { // Japanese構造体を渡してもちゃんと実行できるし、 japanesePeople := &Japanese{} Run(japanesePeople) // American構造体を渡してもちゃんと実行できる americanPeople := &American{} Run(americanPeople) }