Goで学ぶインターフェースと型
インターフェースの基礎
Go初心者が最初に直面する概念の一つがインターフェースです。interfaceはメソッドの集合を定義し、型の抽象化を可能にします。Goの型システムは静的でありながら、インターフェースを使うことでポリモーフィズムを実現できます。例えば、ReaderインターフェースはRead(p []byte) (n int, err error)というメソッドを持ち、FileやBufferなど複数の型が実装できます。
type Reader interface {
Read(p []byte) (n int, err error)
}
このように、インターフェースを実装する型は明示的に宣言する必要はなく、メソッドセットが一致すれば自動的に実装済みとみなされます。これがGoの「実装」モデルの特徴です。
型アサーションと空インターフェース
空インターフェースinterface{}はすべての型を受け取ることができるため、汎用的なデータ構造や関数に便利です。しかし、空インターフェースから具体的な型へ戻すには型アサーションが必要です。型アサーションはv, ok := x.(T)という構文で行い、okがtrueならxは型Tであることを保証します。
var v interface{} = 42
if i, ok := v.(int); ok {
fmt.Println("int:", i)
}
型アサーションは安全性を保ちながら型情報を取得できるため、Go初心者にとっては重要なテクニックです。
ポリモーフィズムと抽象化
ポリモーフィズムは「同じインターフェースを使って異なる型を扱う」ことです。Goではインターフェースを使うことで、関数やメソッドを抽象化し、実装に依存しないコードを書くことができます。例えば、以下のようにProcessorインターフェースを定義し、複数の型が実装することで同じ関数で処理できます。
type Processor interface {
Process() error
}
func Run(p Processor) {
if err := p.Process(); err != nil {
log.Fatal(err)
}
}
このパターンはテスト時にモックを注入したり、拡張性を高める際に非常に有効です。抽象化と型システムの組み合わせにより、Goはシンプルながらも強力なポリモーフィック設計を実現します。
コメント
コメントを投稿