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,
Get 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.