Goのインターフェイスの使い方

Go

何かの手段で通知をしたい場合を例に挙げる

  1. インターフェイスSenderを宣言し、実装すべきメソッドを定義する
  2. 送りたい手段の具体的な構造体を定義する(ここではSlackとメール)
  3. その構造体にインターフェイスのメソッドを実装する
  4. 使用する
package main

type Sender interface {
	Send(msg string) error
}

type Slack struct {}

func (s *Slack) Send(msg string) error {
	// Slackにメッセージを送信する処理
	return nil
}

type Mail struct {}

func (m *Mail) Send(msg string) error {
	// メールを送信する処理
	return nil
}

func main() {
    var sender Sender

	sender = &Mail{}
	err := sender.Send("Hello, Mail!")
	if err != nil {
		// エラー処理
	}

	sender = &Slack{}
	err = sender.Send("Hello, Slack!")
	if err != nil {
		// エラー処理
	}
}

他の言語でも共通することだが、実装をインターフェイスに依存させることで、機能の差し替えがしやすくなったり、テストが書きやすくなる効果がある(モック)。

今回の例では、Slackとメールだが、LINEやChatworkなどの他の通知方法を実装する際にも、このインターフェイスのメソッドを実装しておけば、既存の処理との差し替えが簡単にできるようになる。