スキップしてメイン コンテンツに移動

Goで学ぶインターフェースと型

Goで学ぶインターフェースと型

インターフェースの基礎

Go初心者が最初に直面する概念の一つがインターフェースです。interfaceはメソッドの集合を定義し、型の抽象化を可能にします。Goの型システムは静的でありながら、インターフェースを使うことでポリモーフィズムを実現できます。例えば、ReaderインターフェースはRead(p []byte) (n int, err error)というメソッドを持ち、FileBufferなど複数の型が実装できます。

type Reader interface {
    Read(p []byte) (n int, err error)
}

このように、インターフェースを実装する型は明示的に宣言する必要はなく、メソッドセットが一致すれば自動的に実装済みとみなされます。これがGoの「実装」モデルの特徴です。

型アサーションと空インターフェース

空インターフェースinterface{}はすべての型を受け取ることができるため、汎用的なデータ構造や関数に便利です。しかし、空インターフェースから具体的な型へ戻すには型アサーションが必要です。型アサーションはv, ok := x.(T)という構文で行い、oktrueなら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はシンプルながらも強力なポリモーフィック設計を実現します。

この記事はAIによって作成されました。

コメント