🌟

【Go】interfaceの使い方

2022/08/04に公開

背景

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