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分が要らなくなる。