4.1 柔軟なコードを書くインタフェースの利用法

Goにおいて大規模なプログラムを作るための構成要素として提供されているのが インタフェース です。インタフェースの文法をひと通り説明しても、それほどの行数は必要ありません。メソッドのリストを記述することです。そのインタフェースを型として与えた変数には、実際にどの型のインスタンスかに関係なく、そのインタフェースを満たす型はすべて格納できます。簡単ですね。

Javaなどの言語とは違い「このインタフェースを実装している」という宣言は必要なく、単にインタフェースで定義しているメソッドを実装すればインタフェースを満たしたことになり、変数代入ができます。次のコードは、コンソール、デスクトップ、Slackに通知を飛ばす構造体です。同じメソッドを持っており、そのメソッドを定義しているWarningインタフェースに代入できます。

初心者がハマりそうなポイントとしては、「インタフェースの実体」には「構造体のポインター」が入ります。その点だけ理解すれば使いどころは難しくないでしょう。

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os"

	"github.com/gen2brain/beeep"
)

// すべての構造体の共通インタフェース
type Warning interface {
	Show(message string)
}

// コンソールにメッセージを通知する構造体
type ConsoleWarning struct{}

func (c ConsoleWarning) Show(message string) {
	fmt.Fprintf(os.Stderr,