goのinterface

interfaceといっても印象としては二種類あって、メソッドの型宣言としてのそれと値としてのそれ。
前者はこんな感じ。

type <型名> interface {  
    メソッド名(引数の型, ...) (返り値の型, ...)
    ・
    ・
}

後者はこう

// 空インターフェース定義
var x interface{}  
num := 0  
str := "hello"  
//どんな型でも代入可能
x = num  
x = str  

interfaceを使う意味をまとめる。

値としてのinterface

ゆるく、どんな値でも受け入れる必要がある関数の場合、interfaceで受け取って変換する。

str, ok := interface.(string)  

switchを使って柔軟に変換する

switch i.(type) {  
case int:  
  fmt.Println("私はintです")
case float64:  
  fmt.Println("私はfloat64です")
case string:  
  fmt.Println("私はstringです")
default:  
  fmt.Println("私はそれ以外です")
}

関数としてのinterface

これを使うことで、対象のオブジェクトに差異があっても、メソッド単位でまとめて宣言することができるようになる。

type Person interface {  
    getEmail() string
}
func (s Student) getEmail() string {  
    return s.Name + "@student.ed.jp"
}
func (t Teacher) getEmail() string {  
    return t.Name + "@teacher.ed.jp"
}

ダッグタイピング

"If it walks like a duck and quacks like a duck, it must be a duck" (もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)

これを使えば、case分が要らなくなる。