【Golang】インターフェースについて今一度おさらいしてみる

どもども。夏に向けてそろそろ痩せないといかんなあと思う僕です。


本日はGoのインターフェースについて学び直してみたので記事にしてみたいと思います。


なお、構造体とメソッドについて理解している前提となりますのでその辺りについて怪しい方は先日投稿したこちらの記事も合わせて読んでいただければありがたいです。

インターフェースとは

まずは書き方からみていきましょう。Goにおけるインターフェースの書き方は以下のようになります。

type インターフェース名 interface {
  メソッド名 メソッドが返す値の型
}

上記にもあるとおりインターフェースは"特定のメソッドを満たす"ものであると考えると良さそうです。


簡単な例として以下のようなインターフェースを用意しました。

package main

import "fmt"

type Human interface {
	Talk()
}

type Action struct {
}

func (a Action) Talk() {
	fmt.Println("話す")
}

func main() {
	var human Human
	var action Action

	human = action

	fmt.Println("<人間は>")
	human.Talk()
}

まずはactionという構造体を定義し、Talkメソッドを持たせました。

type Action struct {
}

func (a Action) Talk() {
	fmt.Println("話す")
}

次に上記で定義したTalkメソッドをもつHumanインターフェースを定義します。Talkメソッドに返り値がないので、今回は型を省略します。

type Human interface {
	Talk()
}

あとはmain関数で構造体とインターフェースを代入した変数を定義し、インターフェースに構造体を代入することでインターフェースから構造体がもつメソッドを呼び出すことができます。

func main() {
	var human Human
	var action Action

	human = action

	fmt.Println("<人間は>")
 // インターフェースからメソッドを呼び出す
	human.Talk()
}

実行結果は以下のとおりです。

<人間は>
話す

ここで少し疑問に思うことがあるかもしれません。"構造体からメソッドを呼び出す"ことと何が違うのか、わざわざインターフェースをからメソッドを呼び出す必要はあるのかということです。


これは正直ケースバイケースと思っていますが次のセクションで必要となる例を紹介します。

インターフェースが必要となる例

改めて、インターフェースはどのような時に必要になるのでしょうか。かなり抽象的な例になりますが提示してみます。

package main

import "fmt"

type Human interface {
	Talk()
}

type Bird interface {
	Fly()
}

type Action struct {
}

func (a Action) Talk() {
	fmt.Println("話す")
}

func (a Action) Fly() {
	fmt.Println("飛ぶ")
}

func main() {
	var human Human
	var bird Bird
	var action Action

	human = action
	bird = action

	fmt.Println("<人間は>")
	human.Talk()

	fmt.Println("<鳥は>")
	bird.Fly()
}

先ほどの例と比較して今回の例ではメソッドとインターフェースが増えています。

func (a Action) Fly() {
	fmt.Println("飛ぶ")
}
type Bird interface {
	Fly()
}

実行結果は以下のようになります。

<人間は>
話す
<鳥は>
飛ぶ

FlyメソッドとBirdインターフェースです。さて、今構造体Actionには二つのメソッド(Talkメソッド、Flyメソッド)が実装されています。


しかし、プログラム上では"人間が行う"アクションと"鳥が行う"アクションを区別して使用していく必要があるとした場合構造体Actionからではどちらのメソッドも呼び出すことができてしまい明確に区別することができません。


そこで上記の例ではHumanインターフェースとBirdインターフェースを用意し、それぞれ必要最低限のメソッドを満たしておくことでインターフェース単位で呼び出すことができるメソッドを明確に区別できます。


今回は人間と鳥を例にしたのであまり実用的ではないかもしれませんが、考え方として押さえておくには十分かと思います。


もちろん他にも様々な使用方法がありますが概念を押さえておくとinterfaceという文字列に億劫になることはない"かもしれません"。(なんだかんだinterfaceという言葉を見るとウッとなってしまう筆者です…)

まとめ

今回はGoのインターフェースについておさらいしてみました。


メソッドやポインタと並んで苦手意識を持ってしまいがちなインターフェースですが使っていくうちに慣れていきそうな気がしています。


パッケージの中身を潜ってみるとより詳しく勉強できそうですね!体力は使いそうですけど!


最後まで読んでいただきありがとうございました!


本日のおすすめ

Golang

Posted by CY