しかし、Go 言語には非常に柔軟なインターフェイス概念があり、それを通じて多くのオブジェクト指向機能を実現できます。多くのオブジェクト指向言語は同様のインターフェイス概念を持っていますが、Go 言語のインターフェイス型は暗黙的な実装を満たすという点で独特です。つまり、特定の具象型に対して満足のいくインターフェイス型をすべて定義する必要はなく、必要なメソッドをいくつか用意するだけで十分です。
この設計により、既存の具象型の定義を変更することなく、それらの型を満たす新しいインターフェイス型を作成できます。この設計は、管理下にないパッケージの型を使用する場合に特に役立ちます。
インターフェイス タイプは、他のタイプの動作を抽象化し、一般化したものです。インターフェイス タイプは特定の実装の詳細に束縛されないため、この抽象化を通じて関数をより柔軟で適応性のあるものにすることができます。
インターフェイスは、両当事者によって合意された協力協定です。インターフェイスの実装者はインターフェイスがどのように使用されるかを気にする必要はなく、呼び出し側もインターフェイスの実装の詳細を気にする必要はありません。インターフェイスは、そこに含まれるデータの形式、型、構造を公開しない型および抽象構造です。
インターフェース宣言の形式
各インターフェイス タイプは複数のメソッドで構成されます。インターフェイスのフォームコードは次のとおりです。
type interfaceName interface{
メソッド名1( パラメータリスト1 ) 戻り値リスト1
メソッド名2( パラメータリスト2 ) 戻り値リスト2
...
}
各部の説明:
- インターフェイス タイプ名: type を使用してインターフェイスをカスタム タイプ名として定義します。 Go 言語でインターフェイスに名前を付けるときは、通常、書き込み操作を伴うインターフェイスを Writer、文字列関数を含むインターフェイスを Stringer、閉じる関数を含むインターフェイスを Closer などと呼びます。
- メソッド名: メソッド名の最初の文字が大文字で、インターフェイス型名の最初の文字も大文字の場合、インターフェイスが配置されているパッケージの外部のコードからこのメソッドにアクセスできます。
- パラメータ リスト、戻り値リスト: パラメータ リストおよび戻り値リスト内のパラメータ変数名は無視できます。次に例を示します。
タイプライターインタフェースは次のように定義されます:
type writer interface{
Write([]byte) error
}
開発中の共通インターフェースと記述方法
Go 言語によって提供される多くのパッケージには、io パッケージで提供される Writer インターフェースなどのインターフェースがあります。
type Writer interface {
Write(p []byte) (n int, err error)
}
このインターフェイスは Write() メソッドを呼び出してバイト配列 ([]byte) を書き込むことができ、戻り値は書き込まれたバイト数 (n int) と考えられるエラー (err error) を示します。
同様に、オブジェクトを文字列で表現するインターフェースがあり、このインターフェースの型が実装されていれば、String()メソッドを呼び出すと、オブジェクトに対応する文字列を取得できます。 fmt パッケージでは次のように定義されます。
type Stringer interface {
String() string
}
Stringer インターフェイスは Go 言語で非常に頻繁に使用され、その機能はJavaまたはC#言語の ToString 操作に似ています。
Go 言語の各インターフェイスのメソッドの数はそれほど多くありません。 Go 言語は、インターフェイスを通じて自身の機能を正確に記述し、複数のインターフェイスを埋め込んだり組み合わせたりすることで、単純なインターフェイスを複雑なインターフェイスに拡張することを望んでいます。この章の後のセクションでは、コンポジションを使用してインターフェイスを拡張する方法について説明します。