GoのInterfaceについての個人的まとめ

GoのInterfaceについて

A Tour of Go

上記のページからの引用だがA tour of Goでは以下のように記載されている。

interface(インタフェース)型は、メソッドのシグニチャの集まりで定義します。
そのメソッドの集まりを実装した値を、interface型の変数へ持たせることができます。 

これだけだと個人的にはわかりにくかったが実装すべき関数interface型に定義し、それを実装したstructはinterfaceの型としても扱えるような記法。
こうすることで同じような関数を実装する必要がなくて、コードの記述量を減らすことができるという点がメリットと理解している。

package main

import "fmt"

type englishBot struct{}
type spanishBot struct{}

type bot interface {
    getGreeting() string
}


func printGreeting(b bot) {
    fmt.Println(b.getGreeting())
}
// getGreeting()を実装しているので
// bot型としても扱える
func (englishBot) getGreeting() string {
    return "Hello there"
}


// getGreeting()を実装しているので
// bot型としても扱える
func (spanishBot) getGreeting() string {
    return "Hola"
}

func main() {
    eb := englishBot{}
        // englishBotはbot型でもあるのでprintGreeting関数の引数と渡せる。
    printGreeting(eb)
    sb := spanishBot{}
    printGreeting(sb)
}

interface{}型について これは結局何も関数を定義していない結果、どんなデータ型でもあるという状態。 どんなデータ型が入ってくるかわからない時や、入ってきたデータの型を判別する時に利用すると良い。