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)
}