何らかの方法で通知をしたい場合を例に挙げる
- インターフェイスSenderを宣言し、実装すべきメソッドを定義する
- 送りたい手段の具体的な構造体を定義する(ここではSlackとメール)
- その構造体にインターフェイスのメソッドを実装する
- 使用する
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などの他の通知方法を実装する際にも、このインターフェイスのメソッドを実装すれば、既存の処理との差し替えが簡単にできるようになる。