Skip to main content

Get full access to 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス and 60K+ other titles, with a free 10-day trial of O'Reilly.

There are also live events, courses curated by job role, and more.

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.

Don’t leave empty-handed

Get Mark Richards’s Software Architecture Patterns ebook to better understand how to design components—and how they should interact.

It’s yours, free.

Get it now
Cover of Software Architecture Patterns

Check it out now on O’Reilly

Dive in for free with a 10-day trial of the O’Reilly learning platform—then explore all the other resources our members count on to build skills and solve problems every day.

Start your free trial Become a member now