インターフェースの埋め込み
インターフェースを組み合わせます
「インターフェースの埋め込み」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造体の埋め込み
- インターフェースの埋め込み
- メソッドプロモーション
- 継承よりもコンポジション