0Pricing
Go Academy · レッスン

インターフェースの埋め込み

インターフェースを組み合わせます

「インターフェースの埋め込み」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

インターフェースを組み合わせる

インターフェースには他のインターフェースを埋め込むことができ、メソッドセットを組み合わせてより大きな契約を定義できます。標準ライブラリではこの方法が広く使われています。

埋め込みの構文

あるインターフェースに別のインターフェース型を記述すると、そのすべてのメソッドを含めることができます。

package main

import "fmt"

type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
	Reader
	Writer
}

func main() {
	var rw ReadWriter
	fmt.Println(rw == nil)
}

実際に使われるio.ReadWriter

典型的な例がio.ReadWriterです。これはio.Readerとio.Writerを埋め込んだものとして定義されています。両方のメソッドを持つ型は、これを満たします。

組み合わせたインターフェースを満たす

具象型は、必要なすべてのメソッドを持つだけで、組み合わせたインターフェースを実装できます。

package main

import "fmt"

type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
	Reader
	Writer
}

type File struct{ data string }

func (f *File) Read() string  { return f.data }
func (f *File) Write(s string) { f.data = s }

func main() {
	var rw ReadWriter = &File{}
	rw.Write("hi")
	fmt.Println(rw.Read())
}

インターフェースを組み合わせる理由

小さなインターフェースは実装やテストが簡単です。必要な場所で組み合わせれば、より大きな契約を構築しつつ、それぞれの部品を最小限に保てます。

小さな部品から構築する

役割を絞った単一メソッドのインターフェースを定義し、それらを組み合わせます。

package main

import "fmt"

type Opener interface{ Open() }
type Closer interface{ Close() }
type OpenCloser interface {
	Opener
	Closer
}

type Door struct{}

func (Door) Open()  { fmt.Println("opened") }
func (Door) Close() { fmt.Println("closed") }

func main() {
	var oc OpenCloser = Door{}
	oc.Open()
	oc.Close()
}

メソッドの重複を避ける

埋め込まれたインターフェースが、シグネチャの異なる重複メソッドを提供してはいけません。メソッドセットが同一であれば、最新のGoでは問題ありません。

狭いインターフェースを受け取る

関数は必要とする最小限のインターフェースを要求するべきです。読み取りだけを行うなら、io.ReadWriteCloserではなくio.Readerを受け取ります。

package main

import "fmt"

type Reader interface{ Read() string }

func dump(r Reader) { fmt.Println(r.Read()) }

type Buf struct{}

func (Buf) Read() string { return "data" }

func main() {
	dump(Buf{})
}

ioファミリー

標準ライブラリでは、Reader、Writer、Closerを組み合わせてReadCloser、WriteCloser、ReadWriteCloserを定義しています。契約を整理した、わかりやすい構造です。

APIで組み合わせたインターフェースを使う

値がサポートする中で最も広いインターフェースを返し、関数が使う中で最も狭いインターフェースを受け取ります。これにより、柔軟性と明確さを最大限に高められます。

インターフェースの埋め込みと構造体の埋め込み

  • 構造体の埋め込みはフィールドとメソッドを昇格させ、振る舞いを再利用します
  • インターフェースの埋め込みはメソッド要件を組み合わせ、より大きな契約を作ります

クイックチェック

インターフェースの埋め込みに関する知識を確認しましょう。

まとめ

インターフェースの埋め込みを学びました。

  • 別のインターフェースの中にインターフェースを記述して、メソッドセットを統合します
  • ioパッケージはReader、Writer、Closerを組み合わせています
  • 基本のインターフェースは小さく保ち、必要な場所で組み合わせます
  • 関数が必要とする最も狭いインターフェースを受け取ります

よくある質問

「インターフェースの埋め込み」レッスンは無料ですか?

はい。「インターフェースの埋め込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「インターフェースの埋め込み」で何を学びますか?

インターフェースを組み合わせます ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「インターフェースの埋め込み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造体の埋め込み
  2. インターフェースの埋め込み
  3. メソッドプロモーション
  4. 継承よりもコンポジション
← Go Academyに戻る