🌟
【Go】interfaceの使い方
背景
interfaceの概念の理解が曖昧なので、今回メモまとめてみました。理解が曖昧ですが出来るだけわかりやすくまとめます。わかりやすく伝えるため、若干厳密な定義とはずれているかもしれません。
interfaceとは
一言でいうとinterfaceはなんでも持つことができるものです。これだけではわからないと思うので、次の章で使い方を説明します。
interfaceの使い方
interfaceの使い方をいくつか紹介します。
1つ目は以下のように条件分岐でreturnに複数の型が入る時に型にinterface
を使います。
main.go
func Switch(value string) (result interface{}) {
switch value {
case "string":
result = "string"
case "int":
result = 1
case "bool":
result = true
}
return result
}
fmt.Println(Switch("string"))
fmt.Println(Switch("int"))
fmt.Println(Switch("bool"))
[result]
string
1
true
2つ目は、メソッドを型に持つ方法です。これは少し頭に入ってきづらいかもしれないので、出来るだけわかりやすく説明します。
main.go
type Animal interface {
Eat()
}
type Bird struct {
Name string
}
type Human struct {
Name string
}
func (b Bird) Eat() {
fmt.Printf("%vが食べた\n", b.Name)
}
func (h Human) Eat() {
fmt.Printf("%vが食べた\n", h.Name)
}
func AllEat(a Animal) {
a.Eat()
}
func main() {
var bird = &Bird{Name: "とり"}
bird.Eat()
AllEat(bird)
var human = &Human{Name: "人間"}
human.Eat()
AllEat(human)
}
[result]
とりが食べた
とりが食べた
人間が食べた
人間が食べた
main.go
の中のbird.Eat()
とhuman.Eat()
の型は違いますが、形は同じです。なので、interfaceを使ってEat()
を持たせ、AllEat()
で同じ形の処理をまとめるというのがもう一つの使い方です。このようにinterfaceはメソッドを持たせることもできるのです。
まとめ
いかがでしたでしょうか。若干厳密な説明とは間違っている部分もあるかもしれませんが、わかりやすさを優先させました。
Discussion