インターフェース (interface)
機能
- インターフェースはメソッドの集合を定義する型です。
- インターフェースを実装する型は、そのインターフェースが定義するすべてのメソッドを持っている必要があります。
- インターフェースは、異なる型のオブジェクトが共通のメソッドを持つことを保証し、ポリモーフィズムを実現します。
使い方
-
定義:
type Human interface { Say() string }
-
Human
インターフェースはSay
というメソッドを定義しています。このメソッドは引数を取らず、文字列を返します。
-
-
実装:
- インターフェースを実装するには、そのインターフェースが定義するすべてのメソッドを持つ構造体または型を定義します。
type Person struct { Name string } func (p *Person) Say() string { p.Name = "Mr." + p.Name return p.Name }
-
Person
構造体はSay
メソッドを持っているため、Human
インターフェースを実装しています。
-
使用:
- インターフェース型の変数に実装型のインスタンスを代入できます。
var mike Human = &Person{"Mike"} fmt.Println(mike.Say()) // 出力: Mr.Mike
構造体 (struct)
機能
- 構造体はフィールド(データ)をまとめて管理するためのカスタムデータ型です。
- 構造体はメソッドを持つことができます。これにより、データとその操作をまとめて表現できます。
使い方
-
定義:
type Person struct { Name string }
-
Person
構造体はName
という文字列フィールドを持ちます。
-
-
インスタンス化:
p := Person{"Mike"} fmt.Println(p.Name) // 出力: Mike
-
メソッドの定義:
- メソッドは構造体に関連付けられた関数です。
func (p *Person) Say() string { p.Name = "Mr." + p.Name return p.Name }
-
Say
メソッドはPerson
構造体のポインタレシーバを持ち、Name
フィールドを変更して新しい名前を返します。
インターフェースと構造体の連携
- 構造体はインターフェースを実装することで、異なる構造体が共通のインターフェースを持つことができます。
- これにより、異なる型のオブジェクトを同一の方法で扱うことができます。
func DriveCar(human Human) {
if human.Say() == "Mr.Mike" {
fmt.Println("Run")
} else {
fmt.Println("Get out")
}
}
func main() {
var mike Human = &Person{"Mike"}
var x Human = &Person{"x"}
DriveCar(mike) // 出力: Run
DriveCar(x) // 出力: Get out
}
- このように、
DriveCar
関数はHuman
インターフェースを引数に取り、どの具体的な型のインスタンスであってもインターフェースを実装していれば使用できます。